hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝
Java 中的 Stream 是 Java 8 引入的一种全新的数据处理方式,它基于函数式编程思想,提供了一种高效、简洁且灵活的方式来操作集合数据。Stream 的核心思想是 声明式编程(告诉程序“做什么”,而不是“怎么做”)。
filter → map → collect
),每个操作返回新的 Stream。filter
、map
)不会立即执行,只有在终端操作(如 collect
)触发时才会计算。Stream 可以通过多种方式创建:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream<String> stream = Stream.of("a", "b", "c");
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1); // 无限流
Stream<Double> randomStream = Stream.generate(Math::random); // 生成流
Stream 的操作分为两类:
filter
, map
, sorted
)。collect
, forEach
, reduce
)。filter(Predicate)
:过滤元素List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList()); // [2, 4]
map(Function)
:元素转换List<String> words = Arrays.asList("apple", "banana");
List<Integer> lengths = words.stream()
.map(String::length)
.collect(Collectors.toList()); // [5, 6]
sorted()
:排序List<Integer> numbers = Arrays.asList(3, 1, 4);
List<Integer> sorted = numbers.stream()
.sorted()
.collect(Collectors.toList()); // [1, 3, 4]
distinct()
:去重List<Integer> numbers = Arrays.asList(1, 2, 2, 3);
List<Integer> unique = numbers.stream()
.distinct()
.collect(Collectors.toList()); // [1, 2, 3]
limit(long)
和 skip(long)
:限制和跳过元素List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.skip(2)
.limit(2)
.collect(Collectors.toList()); // [3, 4]
collect(Collector)
:将流转换为集合或其他结构List<String> list = Stream.of("a", "b", "c")
.collect(Collectors.toList()); // [a, b, c]
String joined = Stream.of("a", "b", "c")
.collect(Collectors.joining(", ")); // "a, b, c"
forEach(Consumer)
:遍历元素Stream.of("a", "b", "c")
.forEach(System.out::println); // 输出 a b c
reduce(BinaryOperator)
:归约操作(如求和)int sum = Stream.of(1, 2, 3, 4)
.reduce(0, Integer::sum); // 10
count()
:统计元素数量long count = Stream.of(1, 2, 3).count(); // 3
anyMatch() / allMatch() / noneMatch()
:条件匹配boolean hasEven = Stream.of(1, 3, 5)
.anyMatch(n -> n % 2 == 0); // false
通过 parallelStream()
或 stream().parallel()
创建并行流,利用多核处理器加速处理:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.parallelStream()
.map(n -> n * n)
.collect(Collectors.toList()); // [1, 4, 9, 16]
注意:
Java 提供了针对原始类型的流,避免装箱开销:
IntStream
(int
类型)LongStream
(long
类型)DoubleStream
(double
类型)IntStream.range(1, 5).forEach(System.out::println); // 输出 1 2 3 4
double avg = DoubleStream.of(1.0, 2.0, 3.0).average().orElse(0); // 2.0
List<User> users = ...;
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
Map<String, List<User>> groupByCity = users.stream()
.collect(Collectors.groupingBy(User::getCity));
int totalAge = users.stream()
.mapToInt(User::getAge)
.sum();
IllegalStateException
。map
、filter
中修改外部状态。