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

Lambda表达式

时间:2022-08-27 12:33:13浏览次数:76  
标签: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
From: https://www.cnblogs.com/timqiu/p/16630345.html

相关文章

  • C#验证邮箱格式正则表达式
    1///<summary>2///验证邮箱格式3///</summary>4///<paramname="email"></param>5///<returns></returns>6......
  • 匿名函数lambda
    Golang//https://blog.csdn.net/yyclassmvp/article/details/124942527sum:=func(xint,yint)int{returnx*y}Nodejsconstsum=(x,y)=>x*y;Python......
  • LeetCode 150. 逆波兰表达式求值
    思路:当字符串为运算符号是弹出栈中两个数字进行运算stoi("1")将string转换为intclassSolution{public:intevalRPN(vector<string>&tokens){stack<......
  • Java 基础 - 正则表达式
     一、正则表达式 正则表达式是Java中一门独立的语言,用于检测特定字符串是否符合规则。正则表达式就是用来定义匹配的规则的。1.1规则定义   1.2用法  ......
  • 正则表达式手册
        来源:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html......
  • Mybatis-Plus高级之LambdaQueryWrapper,Wrappers.<实体类>lambdaQuery的使用
    一、前言小编今天又来分享干货了,绝对的干净又卫生,大伙请放心食用哈!Mybatis-Plus我们经常使用,但是里面的很多功能,小编开始只是知道一点点,做个增删改查没问题。小编在新项目......
  • Python正则表达式常用写法
    一、正则表达式模式模式字符串使用特殊的语法来表示一个正则表达式:下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素......
  • js-IIFE-即使调用的函数表达式
    将函数矮化成表达式,一次性函数varfoo=function(){ console.log(2)}();+function(){ console.log(2)}();-function(){ console.log(2)}();!function(){......
  • 正则表达式
    1.概述概念:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。正则表达式就是用来进行文本匹配的工......
  • 【Java】LambdaStream
    JavaLambdaStreamFactoryimportjava.util.*;importjava.util.stream.*;publicclassLambdaStream{publicstatic<T>Stream<T>of(Spliterator<T>split......