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分,我们不见不散!
丙子先生的宗旨是,每两天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。
能力有限,欢迎指教!
相关文章
暂无评论...