参考答案
Lambda表达式的四个主要用途:
1.替代匿名内部类
- Lambda表达式用得最多的场合,是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。
- Lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类。
匿名内部类与Lambda表达式的使用实例对比:
1.1 使用匿名内部类
@Test public void oldRunable() { new Thread(new Runnable() { @Override public void run() { System.out.println("The old runable now is using!"); } }).start(); }
1.2 使用Lambda表达式
@Test public void runable() { new Thread(() -> System.out.println("It's a lambda function!")).start(); }
输出结果:
The old runable now is using! It's a lambda function!
Lambda表达式用极少的代码完成了之前一个类做的事情,让代码变得异常简洁。
2. 使用lambda表达式对集合进行迭代
@Test public void iterTest() { List<String> languages = Arrays.asList("java","scala","python"); //before java8 for(String each:languages) { System.out.println(each); } //after java8 languages.forEach(x -> System.out.println(x)); languages.forEach(System.out::println); }
用forEach不陌生迭代集合中所有的对象,并且将lambda表达式带入其中。
languages.forEach(System.out::println);
3. Stream操作
- Stream是Java8提供的对于元素集合统一、快速、并行操作的一种方式,它能充分运用多核的优势,以及配合lambda表达式、链式结构对集合等进行许多有用的操作。
- Stream如同一个迭代器(Iterator),单向、不可往复,数据只能遍历一次,遍历过一次后就用尽了,像流水流过,一去不返。
简单介绍几个主要方法:
3.1 filter(过滤)
//过滤18岁以上的人 List persons = … Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18);
3.2 Map(映射)
如果想通过某种操作,把一个流中的元素转化成新的流中的元素,可以使用 map() 方法。
public class MapStreamDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("周杰伦"); list.add("王力宏"); list.add("陶喆"); list.add("林俊杰"); Stream<Integer> stream = list.stream().map(String::length); stream.forEach(System.out::println); } }
结果:
3 3 2 3
3.3 limit(截断)
对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素。
3.4 distinct(去重)
对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素
3.5 count(统计)
count方法是一个流的终点方法,可使流的结果最终统计,返回int,比如我们计算一下满足18岁的总人数。
int countOfAdult=persons.stream() .filter(p -> p.getAge() > 18) .map(person -> new Adult(person)) .count();
3.6 Collect(收集流的结果)
collect方法也是一个流的终点方法,可收集最终的结果
List adultList= persons.stream() .filter(p -> p.getAge() > 18) .map(person -> new Adult(person)) .collect(Collectors.toList());
4. 与函数式接口Predicate配合
除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。Predicate接口非常适用于做过滤。
public static void filterTest(List<String> languages, Predicate<String> condition) { languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " ")); } public static void main(String[] args) { List<String> languages = Arrays.asList("Java","Python","scala","Shell","R"); System.out.println("Language starts with J: "); filterTest(languages,x -> x.startsWith("J")); System.out.println("\nLanguage ends with a: "); filterTest(languages,x -> x.endsWith("a")); System.out.println("\nAll languages: "); filterTest(languages,x -> true); System.out.println("\nNo languages: "); filterTest(languages,x -> false); System.out.println("\nLanguage length bigger three: "); filterTest(languages,x -> x.length() > 4); }
结果:
Language starts with J: Java Language ends with a: Java scala All languages: Java Python scala Shell R No languages: Language length bigger three: Python scala Shell
以上,是Java面试题【Lambda表达式的用途有哪些】的参考答案。
输出,是最好的学习方法。
立即行动,在评论区记录下你的问题、笔记或补充~
—end—