其他分享
首页 > 其他分享> > Lambda表达式

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

省略写法

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