Java流式方法,详细版本。

本文详细介绍了Java8中StreamAPI的中间操作(如filter、map、flatMap等)和终端操作(如forEach、collect、count等),展示了如何使用这些方法对数据集合进行高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

流(Stream)是Java 8引入的一项重要特性,它允许以一种更加简洁、函数式的方式对数据集合进行操作。流可以看作是一系列元素的序列,支持各种操作,包括过滤、映射、排序、归约等。总体上分为中间操作和终端操作两种类型

1. 中间操作

1.1 filter(Predicate)

作用:过滤流中的元素,根据给定的谓词(Predicate)判断,只保留符合条件的元素。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());
System.out.println(evenNumbers);  // 输出:[2, 4]
1.2 map(Function)

作用:将流中的每个元素都映射到另一个元素,返回一个新的流。
例子:

List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream()
                                .map(String::length)
                                .collect(Collectors.toList());
System.out.println(wordLengths);  // 输出:[5, 6, 6]
1.3 flatMap(Function)

作用:将流中的每个元素映射为一个流,并将这些流合并为一个流。
例子:


List<List<Integer>> nestedLists = Arrays.asList(
        Arrays.asList(1, 2, 3),
        Arrays.asList(4, 5, 6),
        Arrays.asList(7, 8, 9)
);

List<Integer> flattenedList = nestedLists.stream()
                                        .flatMap(List::stream)
                                        .collect(Collectors.toList());
System.out.println(flattenedList);  // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
1.4 distinct()

作用:去除流中重复的元素。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4);
List<Integer> distinctNumbers = numbers.stream()
                                      .distinct()
                                      .collect(Collectors.toList());
System.out.println(distinctNumbers);  // 输出:[1, 2, 3, 4]
1.5 sorted(Comparator)

作用:对流中的元素进行排序,可以通过传递一个Comparator来指定排序规则。
例子:


List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
List<Integer> sortedNumbers = numbers.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
System.out.println(sortedNumbers);  // 输出:[1, 2, 3, 4, 5]
1.6 limit(long)

作用:限制流的大小,保留前N个元素。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
                                     .limit(3)
                                     .collect(Collectors.toList());
System.out.println(limitedNumbers);  // 输出:[1, 2, 3]
1.7 skip(long)

作用:跳过流的前N个元素。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
                                     .skip(2)
                                     .collect(Collectors.toList());
System.out.println(skippedNumbers);  // 输出:[3, 4, 5]

2. 终端操作

2.1 forEach(Consumer)

作用:对流中的每个元素执行一个操作。
例子:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
// 输出:
// Alice
// Bob
// Charlie
2.2 collect(Collector)

作用:将流中的元素收集到一个集合或其他容器中。
例子:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> collectedNumbers = numbers.stream()
                                       .collect(Collectors.toList());
System.out.println(collectedNumbers);  // 输出:[1, 2, 3, 4, 5]
2.3 count()

作用:返回流中的元素个数。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().count();
System.out.println(count);  // 输出:5
2.4 reduce(BinaryOperator)

作用:对流的元素进行归约操作,返回一个Optional对象。
例子:


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream()
                               .reduce((a, b) -> a + b);
sum.ifPresent(result -> System.out.println("Sum: " + result));  // 输出:Sum: 15
2.5 max(Comparator)

作用:返回流中的最大元素。
例子:

List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
Optional<Integer> maxNumber = numbers.stream()
                                     .max(Comparator.naturalOrder());
maxNumber.ifPresent(max -> System.out.println("Max number: " + max));  // 输出:Max number: 5
2.6 min(Comparator)

作用:返回流中的最小元素。
例子:

List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
Optional<Integer> minNumber = numbers.stream()
                                     .min(Comparator.naturalOrder());
minNumber.ifPresent(min -> System.out.println("Min number: " + min));  // 输出:Min number: 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snail_han

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值