MST

星途 面试题库

面试题:Java函数式接口在集合操作中的深度应用

假设有一个List<Integer>列表,包含1到100的整数。使用Java 8的函数式接口和Stream API,筛选出所有能被3整除的数,并将其平方后求总和,同时解释Stream API中的中间操作和终端操作在此过程中的使用原理。
12.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
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中的中间操作和终端操作原理

  1. 中间操作

    • filter:此操作用于筛选元素。它接收一个Predicate函数式接口作为参数,对Stream中的每个元素进行判断,符合条件的元素将被保留,组成新的Stream。在上述代码中,filter(num -> num % 3 == 0)筛选出能被3整除的数,这一步不会立即执行筛选,而是标记Stream后续需要进行这样的筛选操作。
    • map:该操作用于转换元素。它接收一个Function函数式接口作为参数,对Stream中的每个元素应用该函数,生成一个新的Stream,新Stream中的元素是原元素经过函数转换后的结果。在代码中,map(num -> num * num)将筛选出的能被3整除的数进行平方操作,同样这一步也不会立即执行转换,而是标记后续要进行此转换。中间操作返回的是一个新的Stream,允许链式调用多个中间操作。
  2. 终端操作

    • reduce:终端操作会触发Stream的处理,开始执行之前标记的中间操作,并产生一个最终结果。reduce方法通过一个BinaryOperator函数式接口对Stream中的元素进行累积计算。在上述代码中,reduce(0, Integer::sum)从初始值0开始,使用Integer::sum方法对平方后的数进行累加求和,最终返回总和。终端操作执行后,Stream就会被消耗,不能再被使用。