MST

星途 面试题库

面试题:Java中Stream API如何进行高效的过滤操作

请举例说明在Java Stream API中,如何使用`filter`方法对集合中的元素进行高效过滤,比如从一个包含整数的集合中筛选出所有偶数,并说明如何优化过滤操作以提高性能。
24.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用filter方法筛选偶数示例
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamFilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> evenNumbers = numbers.stream()
               .filter(n -> n % 2 == 0)
               .collect(Collectors.toList());
        System.out.println(evenNumbers);
    }
}

在上述代码中,通过numbers.stream()将集合转换为流,然后使用filter方法传入一个谓词n -> n % 2 == 0,该谓词用于判断元素是否为偶数,最后通过collect(Collectors.toList())将过滤后的元素收集到一个新的列表中。

  1. 优化过滤操作以提高性能的方法
    • 并行流: 如果集合非常大,可以使用并行流来利用多核处理器的优势。只需将stream()替换为parallelStream(),如下:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamFilterParallelExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> evenNumbers = numbers.parallelStream()
               .filter(n -> n % 2 == 0)
               .collect(Collectors.toList());
        System.out.println(evenNumbers);
    }
}

但要注意,并行流也有开销,对于小集合可能反而会降低性能。因为并行流需要将数据分割、合并等操作,这些操作本身也消耗资源。

  • 避免不必要的装箱/拆箱: 如果集合中是基本数据类型,尽量使用对应的原始类型流。例如对于int类型,可以使用IntStream
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.List;

public class IntStreamFilterExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<Integer> evenNumbers = IntStream.of(numbers)
               .filter(n -> n % 2 == 0)
               .boxed()
               .collect(Collectors.toList());
        System.out.println(evenNumbers);
    }
}

这里IntStream.of(numbers)创建一个int类型的流,避免了Integer的装箱操作,提高了性能。之后通过boxed()方法将IntStream转换为Stream<Integer>以便收集到List<Integer>中。

  • 尽早过滤: 如果在处理流的过程中有多个操作,尽量将filter操作放在前面,这样可以减少后续操作处理的数据量。例如,如果要对一个集合中的元素先过滤,再进行复杂的计算,可以先过滤掉不需要的元素,再进行计算,避免对不必要的数据进行复杂计算。