Java8-Lambada详解

1.Lambada使用场景

  • lambda表达式中只能为函数式接口创建实例

补充:

什么是函数式接口?

函数式接口是只包含一个抽象方法声明的接口.java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run(),相似地,ActionListener 接口也是一种函数式接口,我们使用匿名内部类来实例化函数式接口的对象,有了 Lambda 表达式,这一方式可以得到简化。

 

2. Lambda表达式与匿名内部类的联系和区别

联系:

  • lambda表达式创建的对象与匿名内部类生成的对象一样,可以直接调用接口中继承的默认方法。

区别:

  • 匿名内部类可以为任意接口创建实例,不管接口中包含多少个抽象方法,只要在匿名内部类中实现所有抽象方法即可。 但在lambda表达式中只能为函数式接口创建实例。

  • 匿名内部类可以为抽象类甚至普通类创建实例;但lambda表达式只能为函数式接口创建实例。

  • 匿名内部类实现的抽象方法可以允许调用接口中定义默认方法。但lambda表达式的代码块不允许调用接口中定义默认方法。

4. 常见的函数式接口

4.1 Runnable

Runnable runnable = ()->{
    System.out.println(Thread.currentThread().getName());
};
        
Thread thread = new Thread(runnable);
thread.start();
  • Runnable只有一个run函数,且run函数没有参数

4.2 Consumer接口

Consumer接口接收一个参数,不返回参数

public static void consumerFun(int value, Consumer<Integer> c) {
    c.accept(value);
}
//调用
consumerFun(1,(value)->{
    System.out.println(value);
});

4.3 BinConsumer接口

与Consumer接口一样,只不过接收两个参数,返回0个参数

public static void binConsumerFun(String a, String b, BiConsumer<String, String> binc) {
    binc.accept(a, b);
}
//调用
binConsumerFun("hello", "maskwang", (a,b)->{
    System.out.println(a+b)
});

4.4 Predication

作用接收一个参数,返回一个boolean值

public static boolean predicateFun(int value, Predicate<Integer> pre) {
    return pre.test(value);
}
//调用
System.out.println(predicateFun(3, x->x==3));

4.5 Supplier

作用是接收0个参数,返回一个值

public static int supplierFun(Supplier<Integer> supplier) {
    return supplier.get();
}
//调用
System.out.println(supplierFun(()->1));

4.5 Comparator

lambada表达式实现Comparator

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.sort((a,b) -> {return a>b?-1:1;});
 //另一种方式
list.forEach(System.out::println)

4.6 集合的操作

实现集合的遍历

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.forEach((value)->System.out.println(value));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章