Java | Lambda表达式

2018-09-30  本文已影响9人  tingshuo123

Lamba的有效写法

接收一个 String型 参数,并返回一个 int,隐式的返回一个 int

(String s) -> s.length();

接收一个 Apple 类型参数,返回一个 boolean 型

(Apple a) -> a.getWeight() > 150

多个参数,没有返回值,可以包含多条语句

(int x, int y) -> {
    System.out.println("Result: ");
    System.out.println(x + y);
}

没有参数返回 int

() -> 42

语句需要花括号括起来,表达式可以省略花括号。


我们可以在函数式接口上使用Lambda表达式,所谓函数式接口,就是只定义了一个抽象方法的接口(Object 的public方法除外)。比如 Runnable 接口

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

@FunctionalInterface 注解表示你接下来要声明接口是函数接口,如果你用了该注解,而接口却不符合函数式接口的规范,那么编译器将会返回一个错误。

Lambda实践环绕执行 与 行为参数化实现步骤

下面是从一个文件中读取一行所需要的模板代码(使用了带资源的try语句,会自动关闭资源)

    public static String processFile(BufferedReaderProcessor p) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\data.txt"))) {
            return p.process(br);
        }
    }

上面就是环绕执行的例子,处理一个资源,常见的模式就是,打开一个资源,做一些处理,然后关闭资源。这个打开很清理阶段总是很类是,并且围绕着 执行处理的中要代码,这就是环绕执行。


环绕执行

我们可以通过将 处理代码参数化,来简化代码。

用 Lambda 来实现实现行为参数化,大致分四个步骤

第一步

首先创建函数式接口,用以传递行为

@FunctionalInterface
public interface BufferedReaderProcessor {
    
    String process(BufferedReader b) throws IOException;
}
第二步

将函数式接口作为框架方法的参数

    public static String processFile(BufferedReaderProcessor p) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\wqj24\\Desktop\\bbs.sql"))) {
            return p.process(br);  // 通过函数式接口传递的行为
        }
    }
第三步

通过传递不同的 Lambda 表达式,重用processFile方法,用不同的方式处理文件

String oneLine = processFile(br -> br.readLine());  // 读取一行
String twoLine = processFile(br -> br.readLine() + br.readLine());  // 读取两行
// ...

Java 8 中核心函数式接口

Predicate

断言型,接收一个泛型 T 对象,并返回一个 boolean,你可以在需要表示涉及类型 T 的布尔表达式时,使用该接口作为参数,然后传递行为代码。

@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);
}
Consumer

消费型,接收泛型 T 对象,没有返回值(void),如果你需要访问对象T对象,并对其执行某些操作,就可以使用这个接口

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);
}
Function

函数型,java.util.function.Function<T, R> 接口定义了一个 apply 的方法,它接收一个 T 对象,返回一个 泛型R对象,如果你需要将输入对象映射到输出,可以使用这个接口

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
}
Supplier

供给型,定义了一个 get 方法,无参数,返回一个泛型 T 对象,如果你需要获取对象,可以使用这个接口。

@FunctionalInterface
public interface Supplier<T> {

    T get();
}
上一篇 下一篇

猜你喜欢

热点阅读