美文网首页
Java | Lambda表达式

Java | Lambda表达式

作者: tingshuo123 | 来源:发表于2018-09-30 22:34 被阅读9次

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();
}

相关文章

  • Java 8 - Lambda表达式

    Java 8 - Lambda表达式 1 Java 8-概述2 Java 8 - Lambda表达式3 Java ...

  • 【Java】4.0 Java中lambda表达式(下)

    【Java】3.0 Java中lambda表达式(上)【Java】4.0 Java中lambda表达式(下) 7....

  • java 8 lambda表达式中的异常处理

    java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,lambda表达式可以...

  • java8

    1.lambda表达式《java8 Lambda表达式简介》 《java8 lambda表达式,方法的引用以及构造...

  • 《Java 8实战》学习总结

    Java 8新特性概览 Lambda表达式 流 默认方法 Lambda表达式 Lambda和函数式接口Java 8...

  • Java零基础自学DAY10 2018-03-22

    Java 8 新增的lambda表达式 Lambda 转换: Lambda表达式组成: 形参列表 箭头 ( ->)...

  • Java 8、9 语言新特性

    Java语言新特性 Java8 Java 8 新特性 Lambda 表达式 Lambda表达式(也叫做闭包)是Ja...

  • Java的Lambda表达式

    Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法。Lambd...

  • Lambda表达式

    Lambda表达式与函数式接口紧密相关,函数式接口介绍 Lambda表达式的基本语法 Java Lambda表达式...

  • 7 Lambda表达式

    Lambda表达式是Java8的重要更新,Lambda表达式支持将代码块作为方法参数,Lambda表达式允...

网友评论

      本文标题:Java | Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/aclloftx.html