- 并行流(Parallel Stream):Stream 提供了 parallel() 方法,可以将普通的顺序流转换为并行流,以便使用多线程并发执行操作。例如:
list.parallelStream()
.filter(...)
.map(...)
.forEach(...);
并行流适用于对大规模数据进行操作,并且可以通过并行计算充分利用多核处理器的能力。
2.自定义收集器(Custom Collector):Stream 提供了 collect() 方法,可以使用预定义的收集器(如 toList、toSet 等),还可以通过 Collector 接口自定义收集器。自定义收集器可以将 Stream 中的元素收集到一个自定义的容器中,以满足特定的需求。
3.分组(Grouping):Stream 支持根据指定的条件将元素进行分组。可以使用 Collectors.groupingBy() 方法来实现。例如:
Map<Status, List<Task>> tasksByStatus = tasks.stream()
.collect(Collectors.groupingBy(Task::getStatus));
上述代码将任务列表按照任务状态进行分组。
4.分区(Partitioning):与分组类似,但是分区只有两个结果,根据指定的条件将元素分成满足条件和不满足条件的两个部分。可以使用 Collectors.partitioningBy() 方法来实现。例如:
Map<Boolean, List<Task>> partitionedTasks = tasks.stream()
.collect(Collectors.partitioningBy(task -> task.getPriority() > 5));
上述代码将任务列表按照优先级是否大于 5 进行分区。
5.流的延迟计算(Lazy Evaluation):Stream 提供了延迟计算的特性,只有在终端操作被调用时才会执行中间操作。这意味着可以对大规模数据进行链式操作,而无需立即加载和处理整个数据集。这样可以提高效率并节省内存。
6.多级分组(Multi-level Grouping):基于前面的分组操作,可以进行多级的分组操作。例如:
Map<Status, Map<Assignee, List<Task>>> tasksByStatusAndAssignee = tasks.stream()
.collect(Collectors.groupingBy(Task::getStatus,
Collectors.groupingBy(Task::getAssignee)));
上述代码将任务列表首先按照状态进行分组,然后再按照负责人进行分组。