基础 | Java8新特性之Lambda表达式

基础 | Java8新特性之Lambda表达式

Lambda表达式是Java8所引入的新特性之一,其基于函数式接口,以极大地减少代码冗余,并提高代码的可读性。


Lambda表达式的基本语法

参考答案:

Java8中引入箭头操作符(也叫Lambda操作符)将Lambda表达式拆分成左右两部分:

  • 左侧:指定Lambda表达式的参数列表;
  • 右侧:指定Lambda表达式所要执行的功能,即Lambda体。
// 1).无参数,无返回值
Runnable r1 = () -> System.out.println("Hello Lambda!");

// 2).有一个参数,无返回值(只有一个参数时,小括号可以省略)
Consumer<String> con = (x) -> System.out.println(x);
con.accept("Hello Lambda!);

// 3).有两个及以上参数,有返回值,且Lambda体中有多条语句
Comparator<Integer> com = (x, y) -> {
	System.out.println("函数式接口");
	return Integer.compare(x, y);
};

// 若lambda体中仅有一条语句,大括号和return都可以省略

什么是函数式接口?

参考答案:

Lambda表达式需要函数式接口的支持。

仅包含一个抽象方法的接口,称为「函数式接口」。可以在接口上使用@FunctionalInterface注解来检查该接口是否为函数式接口。

注意:函数式接口是Lambda表达式可以使用的关键所在,若一个接口中包含多个抽象方法,是没有办法仅通过表达式左侧的参数列表来定位到对应的方法。


为什么要使用Lambda表达式?

仅对比下面的两个代码实现:

// 实现一
Comparator<String> com = new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		return Integer.compare(o1.length(), o2.length());
	}
};
TreeSet<String> ts = new TreeSet<>(com);

// 实现二:基于Lambda表达式
Comparator<String> com = (x, y) -> Integer.compare(x.length(), y.length());
TreeSet<String> ts = new TreeSet<>(com);

这两个代码都是实现的同一个功能,即创建带比较器的TreeSet集合,基于Lambda表达式的实现代码量少,可读性强。

备注:篇幅有限,此处仅给出一个对比,有兴趣可以再深入学习。


扩展面试题

问:参数列表中为什么可以省略参数类型?

Java8提供了「类型推断」机制。Java编译器可以根据上下文在后台推断出参数的类型,故无需在参数列表中指定参数类型。


推荐阅读


欢迎关注

Java名企面试吧,隔天10点24分,我们不见不散!

丙子先生的宗旨是,每两天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。

能力有限,欢迎指教!

基础 | Java8新特性之Lambda表达式

版权声明:程序员胖胖胖虎阿 发表于 2022年9月10日 上午12:56。
转载请注明:基础 | Java8新特性之Lambda表达式 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...