面试题答案
一键面试- 使用
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())
将过滤后的元素收集到一个新的列表中。
- 优化过滤操作以提高性能的方法:
- 并行流:
如果集合非常大,可以使用并行流来利用多核处理器的优势。只需将
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
操作放在前面,这样可以减少后续操作处理的数据量。例如,如果要对一个集合中的元素先过滤,再进行复杂的计算,可以先过滤掉不需要的元素,再进行计算,避免对不必要的数据进行复杂计算。