lambda表达式

本文深入探讨了Java中的Lambda表达式,包括其语法、如何作为函数式接口的实例使用,以及方法引用的概念。同时,详细解释了变量作用域规则,帮助读者理解如何正确地在Lambda表达式中使用外部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lambda表达式

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

语法

参数->表达式

  1. 当只有一句表达式时
(String first, String second) -> first.length() - second.length();
  1. 当有多句表达式时
(String first, String second)->{
	if(first.length() < second.length()) return -1;
	else return 0;
}
  1. 当无参数时
()-> {
	for(int i = 0; i < 10; i++)
		System.out.println(i);
}
  1. 当参数类型可以被由上下文推到出时,参数类型可以省略
Comparator<String> comp = (first, second)->first.length() - second.length();
  1. 当只有一个参数,且此参数的类型可被推到出,可以省略参数类型以及小括号
ActionListener listener = event->System.out.println("The time is "+new Date());

6.无需指定返回类型

函数式接口

只有一个抽象方法的接口,当需要这种接口的对象时,可以提供一个lambda表达式。
e.g. Arrays.sort()方法,第二个参数需要一个Comparator实例,其是一个只有一个抽象方法的接口,所以可以提供一个lambda表达式

Arrays.sort(words, (first, second)->first.length() - second.length());

方法引用

对象或类名 :: 方法名

  1. object :: instanceMethod
System.out::println  <->  x->System.out.println(x)
  1. Class :: staticMethod
Math :: pow  <->  (x, y)->Math.pow(x, y)

这两种方法引用等价于提供参数的lambda表达式

  1. Class :: instanceMethod
String::compareToIgnoreCase <->  (x,y) -> x.compareToIgnoreCase(y)

这种方法引用,第一个参数会成为方法的目标

类似于lambda表达式,方法引用总是会转化为函数式接口的实例

可以在方法引用中使用this参数。this::equals <-> x.this.equals(x);
也可以使用super参数super::instanceMethod 会调用此方法的超类版本

变量作用域

lambda表达式有3个部分:代码块、参数、自由变量的值(这是指非参数而且不在代码块中定义的变量,且为不会改变的变量,否则并发执行不安全),在java中lambda表达式就是 闭包

  • 合法的访问外部变量
public static void repeatMessage(String text, int delay){
	ActionListener listener = event -> {
		System.out.println(text);
		Toolkit.getDefaultToolkit().beep();
	};
	new Timer(delay, listener).start();
}

repeatMessage("Hello", 1000);
  • 不合法的访问外部变量(变量在代码块内部发生改变)
public static void countDown(int start, int delay){
	ActionListener listener = event ->{
		start--;
		System.out.println(start);
	};
	new Timer(delay, listener).start();
}
  • 不合法的访问外部变量(变量在代码块外部发生改变)
public static void repeat(String text, int ount){
	for(int i = 1; i<=count;i++){
		ActionListener listener = event ->{
			System,out.println(i + ":" + text);
		};
		new Timer(1000, listener).start();
	}
}

lambda表达式的体与嵌套快有相同的作用域,所以变量名不能冲突。

在lambda表达式中使用this关键字,是指创建这个lambda表达式的方法的this参数

public class Application(){
	ActionListener listener = event ->{
		System.out.println(this.toString());//this.toString()会调用Application的对象的toString方法
		...
	}
	...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值