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

Lambda表达式

时间:2023-10-08 15:13:21浏览次数:29  
标签:接口 引用 new Lambda 方法 表达式 lambda

Lambda表达式

前言

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。

lambda表达式的语法

lambda表达式是一个代码块,以及必须传入代码的变量规范。

lambda表达式的形式:

  • (参数列表);
  • 箭头:->;
  • {表达式};
(String first, String second) -> {
  first.length() - second.length();
}

注1:即使参数列表为空,也必须有一个「空括号」。

注2:如果可以推导出一个lambda表达式的参数类型,这编写时可以忽略参数类型的声明。

注3:如果只有一个参数,而且这个参数的类型能推导得出,可以忽略括号。

注4:无须指定lambda表达式的返回类型,返回类型会由上下文推导得出。

警告:如果一个lambda表达式只在某些分支返回一个值,而另外一些分支不返回值,这是不合法的!

函数式接口

对于「只有」一个「抽象」方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式,这种接口称为函数式接口。

lambda表达式可以转换为一个函数式接口。

Arrays.sort(stringList,(first,second) -> {
  first.length() - second.length();
});

在java.util.function包中定义了很多非常通用的函数式接口。

注:lambda表达式不能赋给一个对象,只能转换为函数式接口。

如果需要设计自己的函数式接口,可以使用「@FunctionalInterface注解」来标记这个接口,优点有两个:

  • javadoc页里会指出你的接口时一个函数式接口;
  • 如果不小心增加了另外一个抽象方法,编译器会产生一个错误消息;

方法引用

表达式System.out::println是一个方法引用,它指示编译器生成一个函数式接口的实例,「覆盖」这个接口的抽象方法来调用给定的方法。

var timer = new Timer(1000,System.out::println);

方法引用的语法:

  • 对象名或类名;
  • 分隔符「::」;
  • 方法名;
方法引用 解释
object::instanceMethod 等价于:object -> instanceMethod(object)
Class::instanceMethod 等价于:(x,y) -> x.instanceMethod(y)
Class::staticMethod 等价于:(x,y) -> ClassName.staticMethod(x,y)

注1:只有当lambda表达式的方法体「只调用了一个方法而不做其他操作」时,才能把lambda表达式重写为方法引用。

注2:如果有多个同名的重载方法,编译器回尝试从上下文中找到你指的是哪一个方法。

构造器引用

构造器引用与方法引用类似,只不过方法名为「new」。

ArrayList<String> stringList = new ArrayList(2);
stringList.add("1");
stringList.add("2");
// Persion(String)
stringList.stream().map(Person::new)

如果存在多个构造器方法,编译器会根据上下文选择合适的构造器方法调用。

可以用数组类型建立构造器引用。

// 数组构造器引用,它有一个参数作为数组的长度,等价于lambda表达式:x->new int[x]
int[]::new

Java有一个限制,无法构造泛型类型T的数组,数组构造器引用对于克服这个限制很有用。可以通过传入一个数组构造器引用,通过调用这个构造器来得到正确类型的数组。

注:表达式new T[n]会产生错误,因为这会改为new Object[n]。

// 不使用数组构造器引用
Object[] personArray = steam.toArray();
// 使用数组构造器引用
Person[] personArray = steam.toArray(Person[]::new);

变量作用域

lambda表达式可以捕获外围作用域中变量的值,但是只能引用「值不会改变的变量」。

注1:如果在lambda表达式中更改变量,这是不合法的,因为并发执行多个动作时就会不安全。

注2:如果在lambda表达式中引用一个变量,而这个变量可能在外部发生改变,也是不合法的。

注3:lambda表达式中捕获(引用)的变量必须实际上是事实最终变量(等价于final关键字修饰)。

在一个lambda表达式中使用this关键字时,this指的是创建这个lambda表达的方法所在的对象。

标签:接口,引用,new,Lambda,方法,表达式,lambda
From: https://www.cnblogs.com/myblog20231005/p/17749109.html

相关文章

  • 正则表达式应用场景
    数据验证数据验证应该是正则表达式最常见的场景了,经常用于用户的输入是否符合所需的条件。数据验证可确保输入或导入的数据准确、一致,并符合预定义的规则。验证手机号:constphoneNumber="13712345678";constregex=/^1[3-9]\d{9}$/;console.log("手机号格式正确:",regex.......
  • 给定3个整数a、b、c,计算表达式(a+b)/c的值,/是整除运算。[无解]
    题目4-2:给定3个整数a、b、c,计算表达式(a+b)/c的值,/是整除运算。  给定3个整数a、b、c,计算表达式(a+b)/c的值,/是整除运算。输入格式:输入仅一行,包括三个整数a、b、c,数与数之间以一个空格分开。(-10,000<a,b,c<10,000,c不等于0)输出格式:输出一行,即表达式的值。map......
  • xpath 处理自增的id manage11 使用表达式 //*[starts-with(@id, "manage") and
      //*[starts-with(@id,"manage")andnumber(substring-after(@id,"manage"))=11] 1.使用starts-with()函数选择以"manage"开头的所有元素,2.使用substring-after()函数获取ID中"manage"后面的部分。3.使用number()函数将这部分转换为数字,4.使用逻辑运算符and来判断......
  • 【洛谷 P1739】表达式括号匹配 题解(栈)
    表达式括号匹配题目描述假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以@作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出YES;否则输出NO。表达式长度小于,左圆括号少于个。输入格式一行:表达式。输出格式一行:YES或NO......
  • PostgreSQL 的模式匹配与正则表达式
    一、PostgreSQL实现模式匹配的方法LIKESIMILARTOPOSIX风格的正则表达式模式匹配函数substring二、LIKE操作符只有在匹配整个字符串时返回真符号描述%任意0个或任意个字符_任意一个字符\%%\__postgres=#select*fromtest_zhengze;id|......
  • 【题解】洛谷#P7073 [CSP-J2020] 表达式
    【题解】洛谷#P7073[CSP-J2020]表达式Description给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,求出原表达式的值。表达式将采用后缀表达式的方式输入。Solution根据题目可得,当取反一个操作数的值时,整个表达式大体只有变与不变两种情况,而往下......
  • 正则表达式
    正则表达式一、元字符元字符:即为有特定含义的字符,常见的元字符如下代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意......
  • C语言逗号表达式和赋值表达式
    C语言逗号表达式和赋值表达式笔试常考这个,没办法#include<iostream>usingnamespacestd;intmain(intargc,charconst*argv[]){inta=0,b=0,c=0,d=0;//1.逗号表达式/*表达式1,表达式2,表达式3……表达式n;逗号表达式的求解过程是......
  • 常用的SQL语句小结(三)---复杂查询,CASE表达式,各种连接查询
    1.复杂查询(1)普通子查询SELECTproduct_type,cnt_productFROM(SELECTProduct_type,COUNT(*)AScnt_productFROMProductGROUPBYproduct_type)ASProductSum;()里的是内层查询会首先执行,然后才会执行外层查询子查询可以多层嵌套,但是性能会下降,尽量少用多层子查询 (2)标量......
  • P1054 [NOIP2005 提高组] 等价表达式
    P1054[NOIP2005提高组]等价表达式这个题在计算表达式时可能会出现高次方,比如在某一数据中就出现了2^7^10也就是\(2^{70}\)自然溢出会寄,所以要取模自然溢出\(80\)分ullquick_pow(ullx,ullp){ ullres=1; while(p) { if(p&1)res*=x; p>>=1;......