Java Stream API是用于处理集合(例如List、Set等)中的元素的一种新方式。它引入了函数式编程的概念,使得操作集合变得更加简洁和高效。Stream API中的方法大致分为两类:中间操作(intermediate operations)和终端操作(terminal operations)。中间操作是惰性的,只有在执行终端操作时才会执行。
下面通过代码示例详细说明每个常见的Stream API方法。
1. 创建Stream
Stream可以通过集合、数组、或生成器等方式创建。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 从集合创建Stream
List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> streamFromList = list.stream();
// 从数组创建Stream
String[] array = {"a", "b", "c", "d"};
Stream<String> streamFromArray = Arrays.stream(array);
// 使用Stream的静态方法创建
Stream<String> stream = Stream.of("a", "b", "c", "d");
}
}
2. 中间操作(Intermediate Operations)
中间操作会返回一个新的Stream,它们是惰性的。
map
map
方法用于将当前流中的每个元素映射到另一个元素。
List<String> list = Arrays.asList("a", "b", "c", "d");
List<String> upperList = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
filter
filter
方法用于筛选出符合条件的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
sorted
sorted
方法用于对流中的元素进行排序。
List<String> list = Arrays.asList("d", "a", "c", "b");
List<String> sortedList = list.stream()
.sorted()
.collect(Collectors.toList());
distinct
distinct
方法用于去重流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 1, 4);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
limit
limit
方法用于截断流,使其不超过给定数量。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());
skip
skip
方法用于跳过前n个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList());
3. 终端操作(Terminal Operations)
终端操作会触发流的计算,返回一个结果或副作用。
collect
collect
方法用于将流中的元素收集到一个集合或其他容器中。
List<String> list = Arrays.asList("a", "b", "c", "d");
List<String> collectedList = list.stream()
.collect(Collectors.toList());
forEach
forEach
方法用于遍历流中的每个元素并执行给定的操作。
List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream().forEach(System.out::println);
reduce
reduce
方法用于将流中的元素结合起来。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
count
count
方法用于返回流中元素的数量。
List<String> list = Arrays.asList("a", "b", "c", "d");
long count = list.stream().count();
anyMatch, allMatch, noneMatch
这些方法用于判断流中的元素是否匹配给定的条件。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean anyEven = numbers.stream().anyMatch(n -> n % 2 == 0);
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
boolean noneEven = numbers.stream().noneMatch(n -> n % 2 != 0);
通过这些方法,Java Stream API提供了一种简洁而强大的方式来处理集合中的数据。