首页 > 技术文章 > 【Java】Lambda表达式

wsx2019 2021-12-20 23:30 原文

【Java】函数式编程

Lambda表达式格式

  1. 参照类型可推导 eg:(Integer a, Integer b) -> {return a + b;};
  2. 单行可省略大括号 eg:(a, b) -> a + b;
  3. 单参数可省略小括号 eg:a -> a + a;
  4. 没有参数的时候不可以省略小括号 eg:() -> 1;
private static BiFunction<Integer,Integer,Integer> biFunction = (Integer a, Integer b) -> {return a + b;};

private static BiFunction<Integer,Integer,Integer> biFunction2 = (a, b) -> a + b;

private static Function<Integer,Integer> function =  a -> a + a;

private static Supplier<Integer> supplier =  () -> 1;

函数式接口SAM

函数式接口是一种包含单一抽象方法(single abstract method)的接口。类通过为接口中的所有方法提供实现来实现任何接口,这可以通过顶级类(top-level class)、内部类甚至匿名内部类完成。

内置常用函数式接口

输入 返回值 class descript
T R Function<T,R> 一个输入类型一个输出类型
void T Supplier 没有输入,又一个返回类型
T void Consumer 一个输入类型,没有返回
void void Runnable 没有输入,没有返回
T Boolean Predicate 有一个输入类型,又一个Boolean类型的返回
T T UnaryOperator 有一个输入和一个返回,两者类型相同

1、示例 1

public class RunnableDemo {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(
                    "inside runnable using an anonymous inner class");
            }
        }).start();
    }
}

匿名内部类

使用lambda表达式

new Thread(()-> System.out.println("inside runnable using an anonymous inner class")).start();

将 lambda 表达式赋给变量

Runnable r = 
    ()-> System.out.println("inside runnable using an anonymous inner class");
new Thread(r).start();

2、示例2

FilenameFilter 的匿名内部类实现

File directory = new File("./src/main/java");
String[] names = directory.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".java");
    }
});
System.out.println(Arrays.asList(names));

FilenameFilter 接口的 lambda 表达式实现

File directory = new File("./src/main/java");

String[] names = directory.list((dir, name) -> name.endsWith(".java"));
    System.out.println(Arrays.asList(names));
}

具有显式数据类型的 lambda 表达式

File directory = new File("./src/main/java");

String[] names = 
    directory.list((File dir, String name) -> name.endsWith(".java"));

lambda 代码块

File directory = new File("./src/main/java");

String[] names = directory.list((File dir, String name) -> {
    return name.endsWith(".java");
});
System.out.println(Arrays.asList(names));

lambda 表达式的实现多于一行,则需要使用大括号和显式返回语句。

这就是 lambda 代码块(block lambda)。在本例中,虽然代码主体只有一行,但可以使用大括号将多个语句括起来。注意,不能省略 return 关键字。

推荐阅读