ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Lambda表达式

2022-08-27 12:30:08  阅读:205  来源: 互联网

标签:return 变量 int 成员 实例 表达式 Lambda


作用

简化匿名内部类的代码写法

格式

(匿名内部类被重写方法的形参列表) -> {
    被重写方法的方法体代码
}

注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式

例:

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
});

可以写成:

Arrays.sort(arr, (Integer o1, Integer o2) -> {
    return o2 - o1;
});

函数式接口:接口中有且仅有一个抽象方法的形式,通常会在接口上方加上一个@FunctionalInterface注解,标记

该接口必须满足函数式接口

例:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

省略写法

  • 参数类型可以省略不写
  • 如果只有一个参数,参数类型可以省略,同时()也可以省略
  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号。如果这行代码是return语句,必须省略return不写
Arrays.sort(arr, ((o1, o2) -> o2 - o1));

访问变量

Lambda 表达式可以访问所在外层作用域定义的变量,包括成员变量和局部变量。

访问成员变量

成员变量包括实例成员变量和静态成员变量。在 Lambda 表达式中可以访问这些成员变量,此时的 Lambda 表达式与普通方法一样,可以读取成员变量,也可以修改成员变量。

public class LambdaDemo {    // 实例成员变量    private int value = 10;    // 静态成员变量    private static int staticValue = 5;    // 静态方法,进行加法运算    public static Calculable add() {        Calculable result = (int a, int b) -> {            // 访问静态成员变量,不能访问实例成员变量            staticValue++;            int c = a + b + staticValue;            // this.value;            return c;        };        return result;    }    // 实例方法,进行减法运算    public Calculable sub() {        Calculable result = (int a, int b) -> {            // 访问静态成员变量和实例成员变量            staticValue++;            this.value++;            int c = a - b - staticValue - this.value;            return c;        };        return result;    }}

LambdaDemo 类中声明一个实例成员变量 value 和一个静态成员变量 staticValue。此外,还声明了静态方法 add(见代码第 8 行)和实例方法 sub(见代码第 20 行)。add 方法是静态方法,静态方法中不能访问实例成员变量,所以代码第 13 行的 Lambda 表达式中也不能访问实例成员变量,也不能访问实例成员方法。

sub 方法是实例方法,实例方法中能够访问静态成员变量和实例成员变量,所以代码第 23 行的 Lambda 表达式中可以访问这些变量,当然实例方法和静态方法也可以访问。当访问实例成员变量或实例方法时可以使用 this,如果不与局部变量发生冲突情况下可以省略 this。

访问局部变量

对于成员变量的访问 Lambda 表达式与普通方法没有区别,但是访问局部变量时,变量必须是 final 或Effectively final类型的(不可改变)。

示例代码如下:

public class LambdaDemo {    
    // 实例成员变量    
    private int value = 10;    
    // 静态成员变量    
    private static int staticValue = 5;    
    // 静态方法,进行加法运算    
    public static Calculable add() {        
        // 局部变量        
        int localValue = 20;        
        Calculable result = (int a, int b) -> {            
            // localValue++;            
            // 编译错误            
            int c = a + b + localValue;            
            return c;        
        };        
        return result;    
    }    
    // 实例方法,进行减法运算    
    public Calculable sub() {        
        // final局部变量        
        final int localValue = 20;        
        Calculable result = (int a, int b) -> {            
            int c = a - b - staticValue - this.value;            
            // localValue = c;            
            // 编译错误            
            return c;        
        };        
        return result;    
    }
}

上述代码第 10 行和第 23 行都声明一个局部变量 localValue,Lambda 表达式中访问这个变量,如代码第 14 行和第 25 行。不管这个变量是否显式地使用 final 修饰,它都不能在 Lambda 表达式中修改变量,所以代码第 12 行和第 26 行如果去掉注释会发生编译错误。

Lambda 表达式只能访问局部变量而不能修改,否则会发生编译错误,但对静态变量和成员变量可读可写。

标签:return,变量,int,成员,实例,表达式,Lambda
来源: https://www.cnblogs.com/timqiu/p/16630345.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有