Java 8引入了一项重要的特性,即Stream API。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更简洁、易读,并且支持并行处理,提高了性能。本文将介绍如何结合Lambda表达式和Java 8的Stream API来进行集合操作,展示Stream API的强大功能和使用方法。
创建Stream
在使用Stream API之前,我们首先需要创建一个Stream对象,可以通过以下方式创建:
从集合创建Stream:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> stream = numbers.stream();
从数组创建Stream:
int[] array = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(array);
使用Stream的静态方法创建Stream:
Stream<String> stream = Stream.of("a", "b", "c");
中间操作
中间操作是对Stream对象进行转换和处理的操作,可以链式调用多个中间操作。
filter:根据指定的条件过滤集合元素。
List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList());
map:将集合元素进行转换,生成一个新的Stream。
List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList());
sorted:对集合元素进行排序。
List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList());
distinct:去除重复的集合元素。
List<Integer> uniqueNumbers = numbers.stream() .distinct() .collect(Collectors.toList());
limit:限制Stream的大小。
List<Integer> limitedNumbers = numbers.stream() .limit(3) .collect(Collectors.toList());
skip:跳过指定数量的元素。
List<Integer> skippedNumbers = numbers.stream() .skip(2) .collect(Collectors.toList());
终端操作
终端操作是对Stream对象进行最终操作的操作,执行终端操作后,Stream将不可再用。
forEach:对集合中的每个元素执行指定的操作。
names.stream() .forEach(System.out::println);
collect:将Stream中的元素收集到一个集合中。
List<Integer> collectedNumbers = numbers.stream() .collect(Collectors.toList());
reduce:将Stream中的元素进行归约操作,生成一个结果。
int sum = numbers.stream() .reduce(0, (a, b) -> a + b);
count:统计Stream中的元素数量。
long count = numbers.stream() .count();
min和max:求Stream中的最小值和最大值。
Optional<Integer> min = numbers.stream() .min(Integer::compareTo); Optional<Integer> max = numbers.stream() .max(Integer::compareTo);
anyMatch、allMatch和noneMatch:判断Stream中是否存在满足指定条件的元素。
boolean anyMatch = numbers.stream() .anyMatch(n -> n > 5); boolean allMatch = numbers.stream() .allMatch(n -> n > 0); boolean noneMatch = numbers.stream() .noneMatch(n -> n < 0);
并行处理
Stream API支持并行处理,通过将Stream转换为并行流,可以充分利用多核处理器的优势,提高处理速度。
List<Integer> evenNumbers = numbers.parallelStream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
结论:
通过结合Lambda表达式和Java 8的Stream API,我们可以以一种简洁、灵活和高效的方式对集合进行操作。Stream API提供了丰富的中间操作和终端操作,可以满足各种需求,如过滤、映射、排序、归约等。同时,Stream API还支持并行处理,通过将Stream转换为并行流,可以充分利用多核处理器的优势,提高处理速度。使用Stream API,我们可以编写出更具表现力和可读性的代码,提高开发效率。
参考链接: