Java8之边学边记

一、lambda表达式

1.lambda表达式采用的是函数式编程的概念:

() -> {}

2.lambda表达式代替的是匿名函数,并且只能用在函数式接口(有且只有一个抽象方法),在Java提供的类库中,函数式接口上都有@FunctionalInterface注解。lambda表达式中的{}就是对函数式接口里抽象方法的实现

//例子1:
//函数式接口:
@FunctionalInterface
public interface Employee{
    public void getSalary(){
        
    }
}

public static void main(String[] agrs) {
//匿名函数
    Employee employee = new Employee(){
        @Override
        public void getSalary(){
            System.out.println("111");
        }
    };
}

public static void main(String[] agrs) {
//lambda表达式代替匿名类
    Employee employee = () -> {System.out.println("111");};
}





//例子2:
@FunctionalInterface
public interface MyFunctionalInterface {
    public void single(String msg);
}
 
/**
 * 需要单个参数
 */
public static void testOnePar(MyFunctionalInterface myFunctionalInterface){
    myFunctionalInterface.single("msg");
}
/**
 * 一个参数,可以省略参数的括号
 */
@Test
public void testOneParameter(){
    testOnePar(x-> System.out.println(x));
}

ps:lambda表达式可以代替匿名类:new FunctionalInterface(){},也可代替 FuntionalInterface functionInterface

3. lambda一些小规则:

//情况1
onlyOneParam -> onlyOneExpression;
 
//情况2
onlyOneParam -> onlyOneStatement;

//情况3
(param1,param2) -> {
                        String param = param1 + param2;
                        return param;
                   }

4.java8提供的常用函数式接口:

 四大函数式接口:

1.函数型接口Function<T,R>

        提供任意一种类型的参数,返回另外一个任意类型返回值。 R apply(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        /**
         * testFunction方法中传递的第二个参数是函数型接口Function<String, String>的实例,使用lambda表达式生成
         * 分析(name) -> name + "Li"
         *    (name): 为传递的参数
         *    name + "Li":为实现的方法体
         *    result 为返回值
         */
        String result = testFunction("Tim", (name) -> name + "Li");
        System.out.println("result = " + result);
    }

    /**
     * description: 函数型接口,有输入,有输出
     *
     * @param name
     * @param function
     * @return java.lang.String
    */
    private static String testFunction(String name, Function<String, String> function) {
        // apply()方法为函数型接口Function<String, String>的唯一抽象方法
        return function.apply(name);
    }
}

2.消费性接口Consumer<T>

        提供任意一种类型的参数,返回空值。 void accept(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        /**
         * description: testConsumer()方法中第二个参数传递的是消费性接口Consumer<T>的实例
         * 分析x -> System.out.println("传入的数字为:" + x)
         *    x:为传递的参数
         *    System.out.println("传入的数字为:" + x)相当于抽象方法accept()的方法体
         *    testConsumer 没有返回
         * @param args
         * @return void
        */
       testConsumer(2, x -> System.out.println("传入的数字为:" + x));
    }

    /**
     * description: 消费性接口有输入,但是没有返回值
     *
     * @param x
     * @param consumer
     * @return void
    */
    private static void testConsumer(int x, Consumer<Integer> consumer) {
        // accept()方法为消费性接口Consumer<Integer>的唯一抽象方法
        consumer.accept(x);
    }
}

3. 供给型接口Supplier<T>

参数为空,得到任意一种类型的返回值。T get();

public class FunctionInterface {
    public static void main(String[] args) {
        /**
         * testSupplier()方法的参数是供给型接口Supplier<T>的实例
         * 分析() -> "hello Supplier"
         *    ()中为空说明不需要传参
         *    "hello Supplier"相当于唯一抽象方法get()的方法体
         *    得到返回值result为 "result Supplier"
         */
       String result = testSupplier(() -> "hello Supplier");
        System.out.println("result = " + result);
    }

    /**
     * description: 供给型接口,无输入有输出
     *
     * @param supplier
     * @return java.lang.String
    */
    private static String testSupplier(Supplier<String> supplier) {
        // get()方法为供给型接口Supplier<T>的唯一抽象方法
        return supplier.get();
    }
}

4. 断言型接口Predicate<T> 

提供任意一种类型的参数,返回boolean返回值。boolean test(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        /**
         * testPredicate()方法中的第二个参数为断言型接口Predicate<T>的实例
         * 分析str -> str.equals("a")
         *    str: 为传递的参数
         *    str.equals("a"):相当于唯一抽象方法test()的方法体
         *    testPredicate 返回true或false
         */
       Boolean result = testPredicate("b", str -> str.equals("a"));
        System.out.println("result = " + result);
    }

    /**
     * description:断言型接口,有输入,输出为Boolean
     *
     * @param str
     * @param predicate
     * @return java.lang.Boolean
    */
    private static Boolean testPredicate(String str, Predicate<String> predicate) {
        // test()方法为断言型接口Predicate<T>的唯一抽象方法
        return predicate.test(str);
    }
}

二、方法引用

同lambda表达式,方法引用也可替代函数式接口,使代码更整洁。

方法引用主要有如下三种使用情况

     (1). 类::实例方法

e.g. 

String::compareToIgnoreCase 等同于 (x,y)->x.compareToIgnoreCase(y)

     (2). 类::静态方法

     (3). 对象::实例方法

(2)和(3)等同于lambda表达式,e.g.

System.out::println 等同于(x)->System.out.println(x)
Math::pow 等同于(x,y)->Math.pow(x,y).

此外,方法引用还可以使用this::methodNamesuper::methodName表示该对象或者其父类对象中的方法

还有构造器、自由变量就先不在此赘述了,以后有机会可以看:java8之lambda表达式入门 - 【兰陵笑笑生】 - 博客园

二、 Stream

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值