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

posted @   TimQiu  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示