Stream
Stream 基本概念
Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
java
数据源 -> 中间操作 -> 终止操作Stream自己不会存储元素。Stream不会修改原数据源,而是返回一个新的流。Stream的中间操作通常是惰性执行的,只有遇到终止操作才会真正开始计算。- 一个
Stream只能消费一次,执行完终止操作后不能再次使用。
创建 Stream
stream()
通过集合创建流
java
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println);Arrays.stream(T[] array)
通过数组创建流
java
String[] arr = {"hello", "world"};
Stream<String> stream = Arrays.stream(arr);
stream.forEach(System.out::println);Stream.of(T... values)
直接通过一组元素创建流
java
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.forEach(System.out::println);中间操作
中间操作会返回一个新的 Stream,可以继续拼接后续操作。
filter(Predicate<? super T> predicate)
- 作用:按条件过滤元素
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose", "Jack");
List<String> result = names.stream()
.filter(name -> name.length() > 3)
.collect(Collectors.toList());
System.out.println(result); // [Jerry, Rose, Jack]distinct()
- 作用:去除重复元素
- 注意:依赖元素的
equals()和hashCode()
java
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4);
List<Integer> result = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(result); // [1, 2, 3, 4]skip(long n)
- 作用:跳过前
n个元素
java
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
List<Integer> result = numbers.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println(result); // [40, 50]limit(long maxSize)
- 作用:截取前
maxSize个元素
java
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
List<Integer> result = numbers.stream()
.limit(3)
.collect(Collectors.toList());
System.out.println(result); // [10, 20, 30]map(Function<? super T, ? extends R> mapper)
- 作用:将流中的元素映射成另一种结果
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
List<Integer> lengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // [3, 5, 4]sorted()
- 作用:按元素自然顺序排序
- 注意:元素必须实现
Comparable
java
List<Integer> numbers = Arrays.asList(5, 2, 4, 1, 3);
List<Integer> result = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(result); // [1, 2, 3, 4, 5]sorted(Comparator<? super T> comparator)
- 作用:按指定比较器排序
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose", "Bob");
List<String> result = names.stream()
.sorted((a, b) -> b.length() - a.length())
.collect(Collectors.toList());
System.out.println(result); // [Jerry, Rose, Tom, Bob]终止操作
一旦执行终止操作,流就会被消费,不能再次使用。
allMatch(Predicate<? super T> predicate)
- 作用:判断是否所有元素都满足条件
- 返回值:
true或false
java
List<Integer> numbers = Arrays.asList(2, 4, 6, 8);
boolean result = numbers.stream()
.allMatch(num -> num % 2 == 0);
System.out.println(result); // trueanyMatch(Predicate<? super T> predicate)
- 作用:判断是否至少有一个元素满足条件
- 返回值:
true或false
java
List<Integer> numbers = Arrays.asList(1, 3, 5, 8);
boolean result = numbers.stream()
.anyMatch(num -> num % 2 == 0);
System.out.println(result); // truemax(Comparator<? super T> comparator)
- 作用:按比较器规则获取最大元素
- 返回值:
Optional<T>
java
List<Integer> numbers = Arrays.asList(3, 8, 2, 6);
Optional<Integer> max = numbers.stream()
.max(Integer::compareTo);
System.out.println(max.get()); // 8min(Comparator<? super T> comparator)
- 作用:按比较器规则获取最小元素
- 返回值:
Optional<T>
java
List<Integer> numbers = Arrays.asList(3, 8, 2, 6);
Optional<Integer> min = numbers.stream()
.min(Integer::compareTo);
System.out.println(min.get()); // 2forEach(Consumer<? super T> action)
- 作用:遍历流中的每个元素并执行指定操作
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
names.stream().forEach(System.out::println);reduce(T identity, BinaryOperator<T> accumulator)
- 作用:从初始值开始,对流中元素反复进行归约计算
- 返回值:归约结果
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15reduce(BinaryOperator<T> accumulator)
- 作用:不指定初始值地进行归约
- 返回值:
Optional<T>
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream()
.reduce(Integer::sum);
System.out.println(sum.get()); // 15count()
- 作用:统计流中元素个数
- 返回值:
long
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
long count = names.stream().count();
System.out.println(count); // 3collect(Collector<? super T, A, R> collector)
- 作用:将流中的元素收集到目标容器中
- 返回值:由收集器决定
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
Set<String> set = names.stream()
.collect(Collectors.toSet());
System.out.println(set);findFirst()
- 作用:返回流中的第一个元素
- 返回值:
Optional<T>
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
Optional<String> first = names.stream().findFirst();
System.out.println(first.get()); // TomfindAny()
- 作用:返回流中的任意一个元素
- 返回值:
Optional<T>
java
List<String> names = Arrays.asList("Tom", "Jerry", "Rose");
Optional<String> any = names.stream().findAny();
System.out.println(any.get()); // 可能是任意一个元素