• Java的Lambda表达式学习笔记


    跟着官网的教程一起深入学习Lambda表达式

    Lambda Expressions - Dev.java

    一、写第一个Lambda表达式

            lambda表达式是一种更简单的匿名类实例使用方式,有了lambda表达式就可以不用写匿名类实例了。在使用lambda表达式之前,你需要知道如下几点:

    1.明确你要写的lambda表达式对应的类型

    必须是只有一个抽象方法的接口,也就是除default方法和static方法外,只能有一个抽象方法,这样的接口叫做 functional interface

    例如:

    1. @FunctionalInterface
    2. public interface Runnable {
    3. public abstract void run();
    4. }

    Runnable接口,它有且只有一个抽象方法,注解@FunctionalInterface强调这是一个functional interface,但也可以不写这个注解

    1. @FunctionalInterface
    2. public interface Consumer {
    3. void accept(T t);
    4. default Consumer andThen(Consumersuper T> after) {
    5. // the body of this method has been removed
    6. }
    7. }

    Consumer接口,有一个抽象方法和一个default方法,也符合functional interface标准

    1. @FunctionalInterface
    2. public interface Predicate {
    3. boolean test(T t);
    4. default Predicate and(Predicatesuper T> other) {
    5. // the body of this method has been removed
    6. }
    7. default Predicate negate() {
    8. // the body of this method has been removed
    9. }
    10. default Predicate or(Predicatesuper T> other) {
    11. // the body of this method has been removed
    12. }
    13. static Predicate isEqual(Object targetRef) {
    14. // the body of this method has been removed
    15. }
    16. static Predicate not(Predicatesuper T> target) {
    17. // the body of this method has been removed
    18. }
    19. }

    Predict接口,有一个抽象方法,还有多个default方法和static方法,也符合functional interface标准

    2.明确lambda表达式要实现的方法

    其实就是实现上面说的,接口里面的唯一抽象方法即可:

    1. public abstract void run();
    2. boolean test(T t);
    3. void accept(T t);

    3.用lambda表达式实现接口方法

    lambda表达式的基本语法:参数  ->  方法体,即由三分部组成

    下面以实现Predict接口的test方法为例:

    假如我们需要获取一个Predict实例,那么可以:

    1. Predicate predicate =
    2. (String s) -> {
    3. return s.length() == 3;
    4. };

    针对上面的代码,还可以简化lambda表达式:

    (1)因为编译器知道这里入参类型肯定是String,所有入参可以省略调类型

    (2)当只有一个入参时,可以省略掉括号(),但是多个入参和没有入参时必须要括号()

    (3)方法体很简单时,通常指只有一句代码时,可以省略掉花括号{},并且可以省略掉return关键字

    简化后的写法如下:

    Predicate predicate = s -> s.length() == 3;
    

    4.调用lambda表达式实现的实例方法

    假如我们需要使用Predict的test方法过滤一个String列表,筛选出其中长度为3的字符串

    1. List retainStringsOfLength3(List strings) {
    2. Predicate predicate = s -> s.length() == 3;
    3. List stringsOfLength3 = new ArrayList<>();
    4. for (String s: strings) {
    5. if (predicate.test(s)) {
    6. stringsOfLength3.add(s);
    7. }
    8. }
    9. return stringsOfLength3;
    10. }

    5.lambda表达式只能访问外部的final变量

    在lambda表达式中修改外部变量的值,编译不通过

    在lambda表达式中访问外部非明确声明为final的变量,编译通过

     在lambda表达式中访问外部明确声明为final的变量,编译通过

     

     在lambda表达式中访问外部非final变量,但是在外面修改变量的值,编译报错

    综合上面几种情况看,lambda表达式里面访问的外部变量必须明确声明为final或者不明确但是其他地方都不能修改该变量值

  • 相关阅读:
    技术管理进阶——一线Leader怎么做?经理的速成宝典
    教你将多个不同格式的视频转换成一样的格式
    LeetCode 63. 不同路径 II
    如何利用PHP快速抓取音频数据?
    react:封装组件
    力扣HOT100 - 108. 将有序数组转换为二叉搜索树
    正则验证用户名和跨域postmessage
    关于PSINS运动轨迹仿真模块的理解和思考
    25-全局函数和变量
    常用工具类----HttpClient
  • 原文地址:https://blog.csdn.net/u011998957/article/details/126655071