面试题答案
一键面试import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
int sum = list.stream()
.filter(num -> num % 3 == 0)
.map(num -> num * num)
.reduce(0, Integer::sum);
System.out.println(sum);
}
}
Stream API中的中间操作和终端操作原理
-
中间操作:
- filter:此操作用于筛选元素。它接收一个
Predicate
函数式接口作为参数,对Stream中的每个元素进行判断,符合条件的元素将被保留,组成新的Stream。在上述代码中,filter(num -> num % 3 == 0)
筛选出能被3整除的数,这一步不会立即执行筛选,而是标记Stream后续需要进行这样的筛选操作。 - map:该操作用于转换元素。它接收一个
Function
函数式接口作为参数,对Stream中的每个元素应用该函数,生成一个新的Stream,新Stream中的元素是原元素经过函数转换后的结果。在代码中,map(num -> num * num)
将筛选出的能被3整除的数进行平方操作,同样这一步也不会立即执行转换,而是标记后续要进行此转换。中间操作返回的是一个新的Stream,允许链式调用多个中间操作。
- filter:此操作用于筛选元素。它接收一个
-
终端操作:
- reduce:终端操作会触发Stream的处理,开始执行之前标记的中间操作,并产生一个最终结果。
reduce
方法通过一个BinaryOperator
函数式接口对Stream中的元素进行累积计算。在上述代码中,reduce(0, Integer::sum)
从初始值0开始,使用Integer::sum
方法对平方后的数进行累加求和,最终返回总和。终端操作执行后,Stream就会被消耗,不能再被使用。
- reduce:终端操作会触发Stream的处理,开始执行之前标记的中间操作,并产生一个最终结果。