第十章 收集Stream流中的结果

目录

一、引言 

二、Stream流中的结果到集合中

三、Stream流中的结果到数组中  


一、引言 

上图中,我们针对流操作完成之后,进行了循环遍历输出、统计个数、总数等操作,如果需要将流的结果保存到数组或集合中,我们使用JDK 8提供的方法收集流中的数据。

二、Stream流中的结果到集合中

Stream流提供 collect 方法,其参数需要一个 java.util.stream.Collector<T, A, R> 接口对象来指定收集到哪种集合中。java.util.stream.Collectors 类提供一些方法,可以作为 Collector`接口的实例:

下面是这两个方法的基本使用代码:

三、Stream流中的结果到数组中  

Stream提供 toArray 方法来将结果放到一个数组中,返回值类型是Object[]的:

其使用场景如:

 

### Java Stream API 中的 `collect` 方法 在 Java Stream API 中,`collect` 方法是一个终端操作,用于将中的元素收集到一个集合或其他目标中。由于本身不存储数据,因此需要通过 `collect` 方法将处理后的结果归集到新的集合或对象中[^1]。 以下是一些常见的使用场景和代码示例: #### 1. 将中的元素收集为列表 可以使用 `Collectors.toList()` 方法将中的元素收集为一个 `List`: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectToListExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseNames); // 输出: [ALICE, BOB, CHARLIE] } } ``` #### 2. 将中的元素收集为集合 如果需要将中的元素收集为特定类型的集合(如 `Set` 或 `TreeSet`),可以使用 `Collectors.toSet()` 或 `Collectors.toCollection()`: ```java import java.util.Arrays; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; public class CollectToSetExample { public static void main(String[] args) { Set<String> uniqueNames = Arrays.asList("Alice", "Bob", "Alice") .stream() .collect(Collectors.toSet()); System.out.println(uniqueNames); // 输出: [Alice, Bob] TreeSet<String> sortedNames = Arrays.asList("Charlie", "Bob", "Alice") .stream() .collect(Collectors.toCollection(TreeSet::new)); System.out.println(sortedNames); // 输出: [Alice, Bob, Charlie] } } ``` #### 3. 将中的键值对收集为 Map 可以通过 `Collectors.toMap()` 方法将中的元素收集为 `Map`: ```java import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; public class CollectToMapExample { public static void main(String[] args) { Map<Integer, String> idNameMap = Arrays.asList(new Person(1, "Alice"), new Person(2, "Bob")) .stream() .collect(Collectors.toMap(Person::getId, Person::getName)); System.out.println(idNameMap); // 输出: {1=Alice, 2=Bob} } } class Person { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } ``` #### 4. 并行中的 `collect` 操作 并行虽然使用多线程处理数据,但最终的结果仍然是有序的。下面是一个并行的示例,展示了如何通过 `collect` 方法合并结果[^2]: ```java import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class ParallelStreamCollectExample { public static void main(String[] args) { AtomicInteger counter = new AtomicInteger(0); StringBuilder result = Arrays.stream(new int[]{1, 2, 3, 4}) .parallel() .map(i -> counter.incrementAndGet()) .mapToObj(String::valueOf) .collect(StringBuilder::new, (sb, s) -> sb.append(s).append(", "), StringBuilder::append); System.out.println(result.toString().replaceAll(", $", "")); // 输出可能为:1, 2, 3, 4 } } ``` #### 5. 自定义收集器 如果需要实现更复杂的收集逻辑,可以使用 `Collector.of()` 创建自定义收集器[^3]: ```java import java.util.ArrayList; import java.util.List; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; public class CustomCollectorExample { public static void main(String[] args) { Collector<Integer, List<Integer>, List<Integer>> customCollector = Collector.of( ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; } ); List<Integer> collected = Stream.of(1, 2, 3, 4) .collect(customCollector); System.out.println(collected); // 输出: [1, 2, 3, 4] } } ``` ### 总结 `collect` 方法是 Java Stream API 中非常重要的终端操作,能够将中的元素收集到各种集合或对象中。根据具体需求,可以选择不同的收集器(如 `toList`、`toSet`、`toMap` 等)或创建自定义收集器[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值