Collector 的实现实现了各种有用的归约操作,例如将元素累积到集合中、根据各种条件汇总元素等。
以下是使用预定义收集器执行常见可变归约任务的示例:
// Accumulate names into a List
List<String> list = people.stream()
.map(Person::getName)
.collect(Collectors.toList());
// Accumulate names into a TreeSet
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
// Convert elements to strings and concatenate them, separated by commas
String joined = things.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));
// Compute sum of salaries of employee
int total = employees.stream()
.collect(Collectors.summingInt(Employee::getSalary));
// Group employees by department
Map<Department, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Compute sum of salaries by department
Map<Department, Integer> totalByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
// Partition students into passing and failing
Map<Boolean, List<Student>> passingFailing = students.stream()
.collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
- 自从:
- 1.8
-
方法总结
修饰符和类型方法描述averagingDouble(ToDoubleFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的双值函数的算术平均值。averagingInt(ToIntFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的整数值函数的算术平均值。averagingLong(ToLongFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的长值函数的算术平均值。static <T,A, R, RR>
Collector<T,A, RR> collectingAndThen(Collector<T, A, R> downstream, Function<R, RR> finisher) 调整Collector以执行额外的整理转换。counting()返回一个Collector接受类型为T的元素,它计算输入元素的数量。static <T,A, R> Collector<T, ?, R> 通过将谓词应用于每个输入元素并仅在谓词返回true时才累积,使Collector适应一个接受相同类型T的元素。static <T,U, A, R>
Collector<T,?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<? super U, A, R> downstream) 通过在累加之前对每个输入元素应用平面映射函数,使Collector接受类型为U的元素适应一个接受类型为T的元素。groupingBy(Function<? super T, ? extends K> classifier) 返回一个Collector对类型为T的输入元素执行“分组依据”操作,根据分类函数对元素进行分组,并在Map中返回结果。groupingBy(Function<? super T, ? extends K> classifier, Supplier<M> mapFactory, Collector<? super T, A, D> downstream) 返回一个Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) 返回一个Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。static <T,K> Collector<T, ?, ConcurrentMap<K, List<T>>> groupingByConcurrent(Function<? super T, ? extends K> classifier) 返回并发Collector对类型为T的输入元素执行“分组依据”操作,根据分类函数对元素进行分组。static <T,K, A, D, M extends ConcurrentMap<K, D>>
Collector<T,?, M> groupingByConcurrent(Function<? super T, ? extends K> classifier, Supplier<M> mapFactory, Collector<? super T, A, D> downstream) 返回并发Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。static <T,K, A, D>
Collector<T,?, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) 返回并发Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。static Collector<CharSequence,?, String> joining()返回一个Collector,它将输入元素按遇到顺序连接到一个String中。static Collector<CharSequence,?, String> joining(CharSequence delimiter) 返回一个Collector,它按遇到顺序连接输入元素,由指定的定界符分隔。static Collector<CharSequence,?, String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) 返回一个Collector,它将输入元素连接在一起,由指定的定界符分隔,具有指定的前缀和后缀,按遇到的顺序排列。static <T,U, A, R>
Collector<T,?, R> 通过在累加之前对每个输入元素应用映射函数,使Collector接受类型为U的元素适应一个接受类型为T的元素。maxBy(Comparator<? super T> comparator) 返回根据给定的Comparator生成最大元素的Collector,描述为Optional<T>。minBy(Comparator<? super T> comparator) 返回根据给定的Comparator生成最小元素的Collector,描述为Optional<T>。partitioningBy(Predicate<? super T> predicate) 返回一个Collector,它根据Predicate对输入元素进行分区,并将它们组织成一个Map<Boolean, List<T>>。partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream) 返回一个Collector,它根据一个Predicate对输入元素进行分区,根据另一个Collector减少每个分区中的值,并将它们组织成一个Map<Boolean, D>,其值是下游减少的结果。reducing(BinaryOperator<T> op) 返回一个Collector,它在指定的BinaryOperator下执行其输入元素的缩减。static <T> Collector<T,?, T> reducing(T identity, BinaryOperator<T> op) 返回一个Collector,它使用提供的标识在指定的BinaryOperator下执行其输入元素的缩减。static <T,U> Collector<T, ?, U> reducing(U identity, Function<? super T, ? extends U> mapper, BinaryOperator<U> op) 返回一个Collector,它在指定的map函数和BinaryOperator下执行其输入元素的缩减。static <T> Collector<T,?, DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper) 返回一个Collector,它将double生成的映射函数应用于每个输入元素,并返回结果值的汇总统计信息。static <T> Collector<T,?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) 返回一个Collector,它将int生成映射函数应用于每个输入元素,并返回结果值的汇总统计信息。static <T> Collector<T,?, LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper) 返回一个Collector,它将long生成的映射函数应用于每个输入元素,并返回结果值的汇总统计信息。summingDouble(ToDoubleFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的双值函数的总和。summingInt(ToIntFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的整数值函数的总和。summingLong(ToLongFunction<? super T> mapper) 返回一个Collector,它产生应用于输入元素的长值函数的总和。static <T,R1, R2, R>
Collector<T,?, R> teeing(Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger) 返回一个Collector,它是两个下游收集器的组合。static <T,C extends Collection<T>>
Collector<T,?, C> toCollection(Supplier<C> collectionFactory) 返回一个Collector,它将输入元素累积到一个新的Collection中,按遇到的顺序排列。static <T,K, U> Collector<T, ?, ConcurrentMap<K, U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。static <T,K, U> Collector<T, ?, ConcurrentMap<K, U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。static <T,K, U, M extends ConcurrentMap<K, U>>
Collector<T,?, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapFactory) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。toList()返回一个Collector,它将输入元素累积到一个新的List中。返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) 返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapFactory) 返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。toSet()返回一个Collector,它将输入元素累积到一个新的Set中。返回一个Collector,它将输入元素按遇到顺序累积到 不可修改的列表 中。toUnmodifiableMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) 返回一个Collector,它将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果。toUnmodifiableMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) 返回一个Collector,它将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果。返回将输入元素累积到 不可修改的集合 中的Collector。
-
方法详情
-
toCollection
public static <T,C extends Collection <T>> Collector <T,?, toCollectionC> (Supplier <C> collectionFactory) 返回一个Collector,它将输入元素累积到一个新的Collection中,按遇到的顺序排列。Collection由提供的工厂创建。- 类型参数:
T- 输入元素的类型C- 结果的类型Collection- 参数:
collectionFactory- 供应商提供一个新的空Collection,结果将插入其中- 返回:
Collector将所有输入元素收集到Collection中,按遇到顺序
-
toList
返回一个Collector,它将输入元素累积到一个新的List中。无法保证返回的List的类型、可变性、可序列化性或线程安全性;如果需要对返回的List进行更多控制,请使用toCollection(Supplier)。- 类型参数:
T- 输入元素的类型- 返回:
-
a
Collector将所有输入元素收集到List中,按遇到顺序
-
toUnmodifiableList
返回一个Collector,它将输入元素按遇到顺序累积到 不可修改的列表 中。返回的 Collector 不允许使用 null 值,如果它出现 null 值,将抛出NullPointerException。- 类型参数:
T- 输入元素的类型- 返回:
-
一个
Collector将输入元素按遇到顺序累积到 不可修改的列表 中 - 自从:
- 10
-
toSet
返回一个Collector,它将输入元素累积到一个新的Set中。返回的Set的类型、可变性、可序列化性或线程安全性无法保证;如果需要对返回的Set进行更多控制,请使用toCollection(Supplier)。这是一个
unordered收集器。- 类型参数:
T- 输入元素的类型- 返回:
Collector将所有输入元素收集到Set
-
toUnmodifiableSet
返回将输入元素累积到 不可修改的集合 中的Collector。返回的 Collector 不允许使用 null 值,如果它出现 null 值,将抛出NullPointerException。如果输入包含重复元素,则保留重复项的任意元素。这是一个
unordered收集器。- 类型参数:
T- 输入元素的类型- 返回:
-
将输入元素累积到 不可修改的集合 中的
Collector - 自从:
- 10
-
joining
返回一个Collector,它将输入元素按遇到顺序连接到一个String中。- 返回:
-
一个
Collector将输入元素连接成一个String,在遇到顺序
-
joining
返回一个Collector,它按遇到顺序连接输入元素,由指定的定界符分隔。- 参数:
delimiter- 每个元素之间使用的分隔符- 返回:
-
一个
Collector连接 CharSequence 元素,由指定的定界符分隔,按遇到顺序
-
joining
public static Collector <CharSequence ,?, joiningString > (CharSequence delimiter, CharSequence prefix, CharSequence suffix) 返回一个Collector,它将输入元素连接在一起,由指定的定界符分隔,具有指定的前缀和后缀,按遇到的顺序排列。- 参数:
delimiter- 每个元素之间使用的分隔符prefix- 连接结果开头使用的字符序列suffix- 连接结果末尾使用的字符序列- 返回:
-
一个
Collector连接 CharSequence 元素,由指定的定界符分隔,按遇到顺序
-
mapping
public static <T,U, Collector <T,A, R> ?, mappingR> (Function <? super T, ? extends U> mapper, Collector <? super U, A, R> downstream) 通过在累加之前对每个输入元素应用映射函数,使Collector接受类型为U的元素适应一个接受类型为T的元素。- API 注意:
mapping()收集器在多级缩减中使用时最有用,例如groupingBy或partitioningBy的下游。例如,给定流Person,以累积每个城市的姓氏集:Map<City, Set<String>> lastNamesByCity = people.stream().collect( groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));- 类型参数:
T- 输入元素的类型U- 下游收集器接受的元素类型A- 下游收集器的中间累积类型R- 收集器的结果类型- 参数:
mapper- 应用于输入元素的函数downstream- 一个接受映射值的收集器- 返回:
- 将映射函数应用于输入元素并将映射结果提供给下游收集器的收集器
-
flatMapping
public static <T,U, Collector <T,A, R> ?, flatMappingR> (Function <? super T, ? extends Stream <? extends U>> mapper, Collector <? super U, A, R> downstream) 通过在累加之前对每个输入元素应用平面映射函数,使Collector接受类型为U的元素适应一个接受类型为T的元素。平面映射函数将输入元素映射到stream覆盖零个或多个输出元素,然后在下游累积。每个映射流在其内容被放置到下游之后是closed。 (如果map流是null,则使用空流。)- API 注意:
flatMapping()收集器在多级缩减中使用时最有用,例如groupingBy或partitioningBy的下游。例如,给定流Order,为每个客户累积订单项集:Map<String, Set<LineItem>> itemsByCustomerName = orders.stream().collect( groupingBy(Order::getCustomerName, flatMapping(order -> order.getLineItems().stream(), toSet())));- 类型参数:
T- 输入元素的类型U- 下游收集器接受的元素类型A- 下游收集器的中间累积类型R- 收集器的结果类型- 参数:
mapper- 应用于输入元素的函数,返回结果流downstream- 一个收集器,它将接收映射器返回的流元素- 返回:
- 将映射函数应用于输入元素并将平面映射结果提供给下游收集器的收集器
- 自从:
- 9
-
filtering
public static <T,A, Collector <T,R> ?, filteringR> (Predicate <? super T> predicate, Collector <? super T, A, R> downstream) 通过将谓词应用于每个输入元素并仅在谓词返回true时才累积,使Collector适应一个接受相同类型T的元素。- API 注意:
filtering()收集器在多级缩减中使用时最有用,例如groupingBy或partitioningBy的下游。例如,给定流Employee,以累积每个部门中薪水高于特定阈值的员工:
过滤收集器不同于流的Map<Department, Set<Employee>> wellPaidEmployeesByDepartment = employees.stream().collect( groupingBy(Employee::getDepartment, filtering(e -> e.getSalary() > 2000, toSet())));filter()操作。在这个例子中,假设某个部门没有工资高于阈值的员工。使用如上所示的过滤收集器将导致从该部门到空Set的映射。如果改为执行流filter()操作,则根本不会有该部门的映射。- 类型参数:
T- 输入元素的类型A- 下游收集器的中间累积类型R- 收集器的结果类型- 参数:
predicate- 应用于输入元素的谓词downstream- 一个收集器,它将接受与谓词匹配的值- 返回:
- 将谓词应用于输入元素并向下游收集器提供匹配元素的收集器
- 自从:
- 9
-
collectingAndThen
public static <T,A, Collector <T,R, RR> A, collectingAndThenRR> (Collector <T, A, R> downstream, Function <R, RR> finisher) 调整Collector以执行额外的整理转换。例如,可以调整toList()收集器以始终生成一个不可变列表:List<String> list = people.stream().collect( collectingAndThen(toList(), Collections::unmodifiableList));- 类型参数:
T- 输入元素的类型A- 下游收集器的中间累积类型R- 下游收集器的结果类型RR- 结果收集器的结果类型- 参数:
downstream- 收集器finisher- 应用于下游收集器最终结果的函数- 返回:
- 一个收集器,它执行下游收集器的操作,然后是一个额外的完成步骤
-
counting
返回一个Collector接受类型为T的元素,它计算输入元素的数量。如果不存在任何元素,则结果为 0。- 实现要求:
-
这产生的结果等同于:
reducing(0L, e -> 1L, Long::sum) - 类型参数:
T- 输入元素的类型- 返回:
-
一个
Collector计算输入元素
-
minBy
返回根据给定的Comparator生成最小元素的Collector,描述为Optional<T>。- 实现要求:
-
这产生的结果等同于:
reducing(BinaryOperator.minBy(comparator)) - 类型参数:
T- 输入元素的类型- 参数:
comparator- 用于比较元素的Comparator- 返回:
-
产生最小值的
Collector
-
maxBy
返回根据给定的Comparator生成最大元素的Collector,描述为Optional<T>。- 实现要求:
-
这产生的结果等同于:
reducing(BinaryOperator.maxBy(comparator)) - 类型参数:
T- 输入元素的类型- 参数:
comparator- 用于比较元素的Comparator- 返回:
-
产生最大值的
Collector
-
summingInt
返回一个Collector,它产生应用于输入元素的整数值函数的总和。如果不存在任何元素,则结果为 0。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要求和的属性的函数- 返回:
-
一个
Collector产生派生属性的总和
-
summingLong
返回一个Collector,它产生应用于输入元素的长值函数的总和。如果不存在任何元素,则结果为 0。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要求和的属性的函数- 返回:
-
一个
Collector产生派生属性的总和
-
summingDouble
返回一个Collector,它产生应用于输入元素的双值函数的总和。如果不存在任何元素,则结果为 0。由于累积的舍入误差和不同大小的值,返回的总和可能会根据记录值的顺序而有所不同。按绝对幅度递增排序的值往往会产生更准确的结果。如果任何记录的值是
NaN或总和在任何一点是NaN那么总和将为NaN。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要求和的属性的函数- 返回:
-
一个
Collector产生派生属性的总和
-
averagingInt
返回一个Collector,它产生应用于输入元素的整数值函数的算术平均值。如果不存在任何元素,则结果为 0。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要平均的属性的函数- 返回:
-
一个
Collector产生派生属性的算术平均值
-
averagingLong
返回一个Collector,它产生应用于输入元素的长值函数的算术平均值。如果不存在任何元素,则结果为 0。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要平均的属性的函数- 返回:
-
一个
Collector产生派生属性的算术平均值
-
averagingDouble
返回一个Collector,它产生应用于输入元素的双值函数的算术平均值。如果不存在任何元素,则结果为 0。由于累积的舍入误差和不同大小的值,返回的平均值可能会因记录值的顺序而异。按绝对幅度递增排序的值往往会产生更准确的结果。如果任何记录的值是
NaN或总和在任何一点是NaN那么平均值将为NaN。- 实现注意事项:
double格式可以表示-2范围内的所有连续整数53至 253.如果管道有超过 253值,平均计算中的除数将在 2 处饱和53,导致额外的数值错误。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 提取要平均的属性的函数- 返回:
-
一个
Collector产生派生属性的算术平均值
-
reducing
返回一个Collector,它使用提供的标识在指定的BinaryOperator下执行其输入元素的缩减。- API 注意:
reducing()收集器在groupingBy或partitioningBy下游的多级缩减中使用时最有用。要对流执行简单的缩减,请改用Stream.reduce(Object, BinaryOperator)}。- 类型参数:
T- 减少输入和输出的元素类型- 参数:
identity- 缩减的标识值(也就是没有输入元素时返回的值)op- 一个BinaryOperator<T>用于减少输入元素- 返回:
Collector实现归约操作- 参见:
-
reducing
返回一个Collector,它在指定的BinaryOperator下执行其输入元素的缩减。结果被描述为Optional<T>。- API 注意:
reducing()收集器在groupingBy或partitioningBy下游的多级缩减中使用时最有用。要对流执行简单的缩减,请改用Stream.reduce(BinaryOperator)。例如,给定流
Person,计算每个城市中最高的人:Comparator<Person> byHeight = Comparator.comparing(Person::getHeight); Map<City, Optional<Person>> tallestByCity = people.stream().collect( groupingBy(Person::getCity, reducing(BinaryOperator.maxBy(byHeight))));- 类型参数:
T- 减少输入和输出的元素类型- 参数:
op- 一个BinaryOperator<T>用于减少输入元素- 返回:
Collector实现归约操作- 参见:
-
reducing
public static <T,U> Collector <T,?, reducingU> (U identity, Function <? super T, ? extends U> mapper, BinaryOperator <U> op) 返回一个Collector,它在指定的map函数和BinaryOperator下执行其输入元素的缩减。这是reducing(Object, BinaryOperator)的推广,它允许在缩减之前对元素进行转换。- API 注意:
reducing()收集器在groupingBy或partitioningBy下游的多级缩减中使用时最有用。要对流执行简单的 map-reduce,请改用Stream.map(Function)和Stream.reduce(Object, BinaryOperator)。例如,给定流
Person,计算每个城市居民的最长姓氏:Comparator<String> byLength = Comparator.comparing(String::length); Map<City, String> longestLastNameByCity = people.stream().collect( groupingBy(Person::getCity, reducing("", Person::getLastName, BinaryOperator.maxBy(byLength))));- 类型参数:
T- 输入元素的类型U- 映射值的类型- 参数:
identity- 缩减的标识值(也就是没有输入元素时返回的值)mapper- 应用于每个输入值的映射函数op- 用于减少映射值的BinaryOperator<U>- 返回:
-
a
Collector实现 map-reduce 操作 - 参见:
-
groupingBy
public static <T,K> Collector <T,?, groupingByMap <K, List <T>>> (Function <? super T, ? extends K> classifier) 返回一个Collector对类型为T的输入元素执行“分组依据”操作,根据分类函数对元素进行分组,并在Map中返回结果。分类函数将元素映射到某个键类型
K。收集器生成一个Map<K, List<T>>,其键是将分类函数应用于输入元素所产生的值,其对应的值为Lists,其中包含映射到分类函数下关联键的输入元素。不保证返回的
Map或List对象的类型、可变性、可序列化性或线程安全性。- 实现要求:
-
这会产生类似于以下内容的结果:
groupingBy(classifier, toList()); - 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要保留元素在生成的Map收集器中出现的顺序,则使用groupingByConcurrent(Function)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 键的类型- 参数:
classifier- 将输入元素映射到键的分类器函数- 返回:
Collector实现分组操作- 参见:
-
groupingBy
public static <T,K, Collector <T,A, D> ?, groupingByMap <K, D>> (Function <? super T, ? extends K> classifier, Collector <? super T, A, D> downstream) 返回一个Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。分类函数将元素映射到某个键类型
K。下游收集器对T类型的元素进行操作并产生D类型的结果。生成的收集器生成一个Map<K, D>。不保证返回的
Map的类型、可变性、可序列化性或线程安全性。例如,要计算每个城市的人的姓氏集:
Map<City, Set<String>> namesByCity = people.stream().collect( groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));- 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要保留元素呈现给下游收集器的顺序,则使用groupingByConcurrent(Function, Collector)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 键的类型A- 下游收集器的中间累积类型D- 下游归约的结果类型- 参数:
classifier- 将输入元素映射到键的分类器函数downstream- 一个Collector实施下游减少- 返回:
Collector实现级联分组操作- 参见:
-
groupingBy
public static <T,K, Collector <T,D, A, M extends Map <K, D>> ?, groupingByM> (Function <? super T, ? extends K> classifier, Supplier <M> mapFactory, Collector <? super T, A, D> downstream) 返回一个Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。 Collector 生成的Map是使用提供的工厂函数创建的。分类函数将元素映射到某个键类型
K。下游收集器对T类型的元素进行操作并产生D类型的结果。生成的收集器生成一个Map<K, D>。例如,要计算每个城市中人们的姓氏集合,其中城市名称是排序的:
Map<City, Set<String>> namesByCity = people.stream().collect( groupingBy(Person::getCity, TreeMap::new, mapping(Person::getLastName, toSet())));- 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要保留元素呈现给下游收集器的顺序,则使用groupingByConcurrent(Function, Supplier, Collector)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 键的类型D- 下游归约的结果类型A- 下游收集器的中间累积类型M- 结果的类型Map- 参数:
classifier- 将输入元素映射到键的分类器函数mapFactory- 供应商提供一个新的空Map,结果将插入其中downstream- 一个Collector实施下游减少- 返回:
Collector实现级联分组操作- 参见:
-
groupingByConcurrent
public static <T,K> Collector <T,?, groupingByConcurrentConcurrentMap <K, List <T>>> (Function <? super T, ? extends K> classifier) 返回并发Collector对类型为T的输入元素执行“分组依据”操作,根据分类函数对元素进行分组。这是
concurrent和unordered收集器。分类函数将元素映射到某个键类型
K。收集器生成一个ConcurrentMap<K, List<T>>,其键是将分类函数应用于输入元素所产生的值,其对应的值为Lists,其中包含映射到分类函数下关联键的输入元素。不保证返回的
ConcurrentMap或List对象的类型、可变性或可序列化性,也不保证返回的List对象的线程安全性。- 实现要求:
-
这会产生类似于以下内容的结果:
groupingByConcurrent(classifier, toList()); - 类型参数:
T- 输入元素的类型K- 键的类型- 参数:
classifier- 将输入元素映射到键的分类器函数- 返回:
-
一个并发的、无序的
Collector实现分组操作 - 参见:
-
groupingByConcurrent
public static <T,K, Collector <T,A, D> ?, groupingByConcurrentConcurrentMap <K, D>> (Function <? super T, ? extends K> classifier, Collector <? super T, A, D> downstream) 返回并发Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。这是
concurrent和unordered收集器。分类函数将元素映射到某个键类型
K。下游收集器对T类型的元素进行操作并产生D类型的结果。生成的收集器生成一个ConcurrentMap<K, D>。无法保证返回的
ConcurrentMap的类型、可变性或可序列化性。例如,要计算每个城市中人们的姓氏集合,其中城市名称是排序的:
ConcurrentMap<City, Set<String>> namesByCity = people.stream().collect( groupingByConcurrent(Person::getCity, mapping(Person::getLastName, toSet())));- 类型参数:
T- 输入元素的类型K- 键的类型A- 下游收集器的中间累积类型D- 下游归约的结果类型- 参数:
classifier- 将输入元素映射到键的分类器函数downstream- 一个Collector实施下游减少- 返回:
-
一个并发的、无序的
Collector实现级联分组操作 - 参见:
-
groupingByConcurrent
public static <T,K, Collector <T,A, D, M extends ConcurrentMap <K, D>> ?, groupingByConcurrentM> (Function <? super T, ? extends K> classifier, Supplier <M> mapFactory, Collector <? super T, A, D> downstream) 返回并发Collector对类型为T的输入元素实施级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游Collector对与给定键关联的值执行缩减操作。收集器生成的ConcurrentMap是使用提供的工厂函数创建的。这是
concurrent和unordered收集器。分类函数将元素映射到某个键类型
K。下游收集器对T类型的元素进行操作并产生D类型的结果。生成的收集器生成一个ConcurrentMap<K, D>。例如,要计算每个城市中人们的姓氏集合,其中城市名称是排序的:
ConcurrentMap<City, Set<String>> namesByCity = people.stream().collect( groupingByConcurrent(Person::getCity, ConcurrentSkipListMap::new, mapping(Person::getLastName, toSet())));- 类型参数:
T- 输入元素的类型K- 键的类型A- 下游收集器的中间累积类型D- 下游归约的结果类型M- 结果ConcurrentMap的类型- 参数:
classifier- 将输入元素映射到键的分类器函数mapFactory- 供应商提供一个新的空ConcurrentMap,结果将插入其中downstream- 一个Collector实施下游减少- 返回:
-
一个并发的、无序的
Collector实现级联分组操作 - 参见:
-
partitioningBy
public static <T> Collector <T,?, partitioningByMap <Boolean , List <T>>> (Predicate <? super T> predicate) 返回一个Collector,它根据Predicate对输入元素进行分区,并将它们组织成一个Map<Boolean, List<T>>。返回的Map始终包含false和true键的映射。无法保证返回的Map或List的类型、可变性、可序列化性或线程安全性。- API 注意:
- 如果一个分区没有元素,它在结果 Map 中的值将是一个空列表。
- 类型参数:
T- 输入元素的类型- 参数:
predicate- 用于对输入元素进行分类的谓词- 返回:
Collector实现分区操作- 参见:
-
partitioningBy
public static <T,D, Collector <T,A> ?, partitioningByMap <Boolean , D>> (Predicate <? super T> predicate, Collector <? super T, A, D> downstream) 返回一个Collector,它根据一个Predicate对输入元素进行分区,根据另一个Collector减少每个分区中的值,并将它们组织成一个Map<Boolean, D>,其值是下游减少的结果。返回的
Map始终包含false和true键的映射。不保证返回的Map的类型、可变性、可序列化性或线程安全性。- API 注意:
- 如果一个partition没有元素,它在结果Map中的值将通过调用下游收集器的supplier函数,然后应用finisher函数来获取。
- 类型参数:
T- 输入元素的类型D- 下游归约的结果类型A- 下游收集器的中间累积类型- 参数:
predicate- 用于对输入元素进行分类的谓词downstream- 一个Collector实施下游减少- 返回:
-
a
Collector实现级联分区操作 - 参见:
-
toMap
public static <T,K, Collector <T,U> ?, toMapMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper) 返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。如果map的键包含重复项(根据
Object.equals(Object)),则在执行收集操作时抛出IllegalStateException。如果map的键可能有重复项,请改用toMap(Function, Function, BinaryOperator)。不保证返回的
Map的类型、可变性、可序列化性或线程安全性。- API 注意:
-
键或值作为输入元素是很常见的。在这种情况下,实用方法
Function.identity()可能会有所帮助。例如,以下生成Map将学生映射到他们的平均成绩:
并且以下生成Map<Student, Double> studentToGPA = students.stream().collect( toMap(Function.identity(), student -> computeGPA(student)));Map将唯一标识符映射到学生:Map<String, Student> studentIdToStudent = students.stream().collect( toMap(Student::getId, Function.identity())); - 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要将结果按遇到顺序插入Map,则使用toConcurrentMap(Function, Function)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数valueMapper- 生成值的映射函数- 返回:
Collector将元素收集到Map中,其键和值是将映射函数应用于输入元素的结果- 参见:
-
toUnmodifiableMap
public static <T,K, Collector <T,U> ?, toUnmodifiableMapMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper) 返回一个Collector,它将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果。如果map的键包含重复项(根据
Object.equals(Object)),则在执行收集操作时抛出IllegalStateException。如果map的键可能有重复项,请使用toUnmodifiableMap(Function, Function, BinaryOperator)来处理值的合并。返回的 Collector 不允许空键和空值。如果任一映射函数返回 null,将抛出
NullPointerException。- 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数,必须为非空valueMapper- 生成值的映射函数,必须为非空- 返回:
-
一个
Collector将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果 - 抛出:
NullPointerException- 如果 keyMapper 或 valueMapper 为空- 自从:
- 10
- 参见:
-
toMap
public static <T,K, Collector <T,U> ?, toMapMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper, BinaryOperator <U> mergeFunction) 返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),值映射函数将应用于每个相等的元素,并使用提供的合并函数合并结果。不保证返回的
Map的类型、可变性、可序列化性或线程安全性。- API 注意:
-
有多种方法可以处理映射到同一键的多个元素之间的冲突。
toMap的其他形式只是简单地使用无条件抛出的合并函数,但您可以轻松编写更灵活的合并策略。例如,如果你有一个Person的流,你想产生一个“电话簿”映射名字到地址,但是两个人有可能有相同的名字,你可以像下面这样优雅地处理这些冲突,并生成一个Map映射名称到一个连接的地址列表:Map<String, String> phoneBook = people.stream().collect( toMap(Person::getName, Person::getAddress, (s, a) -> s + ", " + a)); - 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要将结果按遇到顺序合并到Map中,则使用toConcurrentMap(Function, Function, BinaryOperator)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数valueMapper- 生成值的映射函数mergeFunction- 合并函数,用于解决与相同键关联的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)- 返回:
Collector将元素收集到Map中,其键是将键映射函数应用于输入元素的结果,其值是将值映射函数应用于等于键的所有输入元素并使用合并将它们组合的结果功能- 参见:
-
toUnmodifiableMap
public static <T,K, Collector <T,U> ?, toUnmodifiableMapMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper, BinaryOperator <U> mergeFunction) 返回一个Collector,它将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),值映射函数将应用于每个相等的元素,并使用提供的合并函数合并结果。返回的 Collector 不允许空键和空值。如果任一映射函数返回 null,将抛出
NullPointerException。- 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数,必须为非空valueMapper- 生成值的映射函数,必须为非空mergeFunction- 合并函数,用于解决与相同键关联的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction),必须是非空的- 返回:
-
一个
Collector将输入元素累积到一个 不可修改的map 中,其键和值是将提供的映射函数应用于输入元素的结果 - 抛出:
NullPointerException- 如果 keyMapper、valueMapper 或 mergeFunction 为 null- 自从:
- 10
- 参见:
-
toMap
public static <T,K, Collector <T,U, M extends Map <K, U>> ?, toMapM> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper, BinaryOperator <U> mergeFunction, Supplier <M> mapFactory) 返回一个Collector,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),值映射函数将应用于每个相等的元素,并使用提供的合并函数合并结果。Map由提供的供应商函数创建。- 实现注意事项:
-
返回的
Collector不是并发的。对于并行流管道,combiner函数通过将键从一个映射合并到另一个map来运行,这可能是一项昂贵的操作。如果不需要将结果按遇到顺序合并到Map中,则使用toConcurrentMap(Function, Function, BinaryOperator, Supplier)可能会提供更好的并行性能。 - 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型M- 结果的类型Map- 参数:
keyMapper- 生成键的映射函数valueMapper- 生成值的映射函数mergeFunction- 合并函数,用于解决与相同键关联的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)mapFactory- 供应商提供一个新的空Map,结果将插入其中- 返回:
Collector将元素收集到Map中,其键是将键映射函数应用于输入元素的结果,其值是将值映射函数应用于等于键的所有输入元素并使用合并将它们组合的结果功能- 参见:
-
toConcurrentMap
public static <T,K, Collector <T,U> ?, toConcurrentMapConcurrentMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),则在执行收集操作时抛出IllegalStateException。如果map的键可能有重复项,请改用toConcurrentMap(Function, Function, BinaryOperator)。无法保证返回的
ConcurrentMap的类型、可变性或可序列化性。- API 注意:
-
键或值作为输入元素是很常见的。在这种情况下,实用方法
Function.identity()可能会有所帮助。例如,以下生成一个ConcurrentMap将学生映射到他们的平均成绩:
而以下生成一个ConcurrentMap<Student, Double> studentToGPA = students.stream().collect( toConcurrentMap(Function.identity(), student -> computeGPA(student)));ConcurrentMap将唯一标识符映射到学生:ConcurrentMap<String, Student> studentIdToStudent = students.stream().collect( toConcurrentMap(Student::getId, Function.identity()));这是
concurrent和unordered收集器。 - 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数valueMapper- 产生值的映射函数- 返回:
-
并发的、无序的
Collector将元素收集到ConcurrentMap中,其键是将键映射函数应用于输入元素的结果,其值是将值映射函数应用于输入元素的结果 - 参见:
-
toConcurrentMap
public static <T,K, Collector <T,U> ?, toConcurrentMapConcurrentMap <K, U>> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper, BinaryOperator <U> mergeFunction) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),值映射函数将应用于每个相等的元素,并使用提供的合并函数合并结果。无法保证返回的
ConcurrentMap的类型、可变性或可序列化性。- API 注意:
-
有多种方法可以处理映射到同一键的多个元素之间的冲突。
toConcurrentMap的其他形式只是简单地使用无条件抛出的合并函数,但您可以轻松编写更灵活的合并策略。例如,如果你有一个Person的流,你想产生一个“电话簿”映射名字到地址,但是两个人有可能有相同的名字,你可以像下面这样优雅地处理这些冲突,并生成一个ConcurrentMap映射名称到一个连接的地址列表:ConcurrentMap<String, String> phoneBook = people.stream().collect( toConcurrentMap(Person::getName, Person::getAddress, (s, a) -> s + ", " + a));这是
concurrent和unordered收集器。 - 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型- 参数:
keyMapper- 生成键的映射函数valueMapper- 生成值的映射函数mergeFunction- 合并函数,用于解决与相同键关联的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)- 返回:
-
并发的、无序的
Collector将元素收集到ConcurrentMap中,其键是对输入元素应用键映射函数的结果,其值是对等于键的所有输入元素应用值映射函数并将它们组合的结果使用合并功能 - 参见:
-
toConcurrentMap
public static <T,K, Collector <T,U, M extends ConcurrentMap <K, U>> ?, toConcurrentMapM> (Function <? super T, ? extends K> keyMapper, Function <? super T, ? extends U> valueMapper, BinaryOperator <U> mergeFunction, Supplier <M> mapFactory) 返回并发的Collector将元素累积到ConcurrentMap中,其键和值是将提供的映射函数应用于输入元素的结果。如果map键包含重复项(根据
Object.equals(Object)),值映射函数将应用于每个相等的元素,并使用提供的合并函数合并结果。ConcurrentMap由提供的供应商函数创建。这是
concurrent和unordered收集器。- 类型参数:
T- 输入元素的类型K- 按键映射函数的输出类型U- 值映射函数的输出类型M- 结果ConcurrentMap的类型- 参数:
keyMapper- 生成键的映射函数valueMapper- 生成值的映射函数mergeFunction- 合并函数,用于解决与相同键关联的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)mapFactory- 供应商提供一个新的空ConcurrentMap,结果将插入其中- 返回:
-
并发的、无序的
Collector将元素收集到ConcurrentMap中,其键是对输入元素应用键映射函数的结果,其值是对等于键的所有输入元素应用值映射函数并将它们组合的结果使用合并功能 - 参见:
-
summarizingInt
public static <T> Collector <T,?, summarizingIntIntSummaryStatistics > (ToIntFunction <? super T> mapper) 返回一个Collector,它将int生成映射函数应用于每个输入元素,并返回结果值的汇总统计信息。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 应用于每个元素的映射函数- 返回:
Collector实施摘要统计减少- 参见:
-
summarizingLong
public static <T> Collector <T,?, summarizingLongLongSummaryStatistics > (ToLongFunction <? super T> mapper) 返回一个Collector,它将long生成的映射函数应用于每个输入元素,并返回结果值的汇总统计信息。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 应用于每个元素的映射函数- 返回:
Collector实施摘要统计减少- 参见:
-
summarizingDouble
public static <T> Collector <T,?, summarizingDoubleDoubleSummaryStatistics > (ToDoubleFunction <? super T> mapper) 返回一个Collector,它将double生成的映射函数应用于每个输入元素,并返回结果值的汇总统计信息。- 类型参数:
T- 输入元素的类型- 参数:
mapper- 应用于每个元素的映射函数- 返回:
Collector实施摘要统计减少- 参见:
-
teeing
public static <T,R1, Collector <T,R2, R> ?, teeingR> (Collector <? super T, ?, R1> downstream1, Collector <? super T, ?, R2> downstream2, BiFunction <? super R1, ? super R2, R> merger) 返回一个Collector,它是两个下游收集器的组合。传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将它们的结果合并到最终结果中。生成的收集器函数执行以下操作:
- supplier:创建一个结果容器,其中包含通过调用每个收集器的供应商获得的结果容器
- 累加器:调用每个收集器的累加器及其结果容器和输入元素
- 组合器:用两个结果容器调用每个收集器的组合器
- finisher:调用每个收集器的 finisher 及其结果容器,然后调用提供的合并并返回其结果。
如果两个下游收集器都是无序的,则生成的收集器是
Collector.Characteristics.UNORDERED;如果两个下游收集器是并发的,则生成的收集器是Collector.Characteristics.CONCURRENT。- 类型参数:
T- 输入元素的类型R1- 第一个收集器的结果类型R2- 第二个收集器的结果类型R- 最终结果类型- 参数:
downstream1- 第一个下游收集器downstream2- 第二个下游收集器merger- 将两个结果合并为一个结果的函数- 返回:
Collector聚合了两个提供的收集器的结果。- 自从:
- 12
-