Java 8并行流并发分组

假设我有一堂课

Class Person {

String name;

String uid;

String phone;

}

我试图按班上所有领域分组。如何在JAVA 8中使用并行流来转换

List<Person> into Map<String,Set<Person>>

映射的键是类中每个字段的值。JAVA 8以下示例将单个字段分组,如何将一个类的所有字段归为一个Map?

ConcurrentMap<Person.Sex, List<Person>> byGender =

roster

.parallelStream()

.collect(

Collectors.groupingByConcurrent(Person::getGender));

回答:

您可以使用的of静态工厂方法来实现Collector

Map<String, Set<Person>> groupBy = persons.parallelStream()

.collect(Collector.of(

ConcurrentHashMap::new,

( map, person ) -> {

map.computeIfAbsent(person.name, k -> new HashSet<>()).add(person);

map.computeIfAbsent(person.uid, k -> new HashSet<>()).add(person);

map.computeIfAbsent(person.phone, k -> new HashSet<>()).add(person);

},

( a, b ) -> {

b.forEach(( key, set ) -> a.computeIfAbsent(key, k -> new HashSet<>()).addAll(set));

return a;

}

));

正如Holger在评论中所建议的那样,以下方法可能比上述方法更可取:

Map<String, Set<Person>> groupBy = persons.parallelStream()

.collect(HashMap::new, (m, p) -> {

m.computeIfAbsent(p.name, k -> new HashSet<>()).add(p);

m.computeIfAbsent(p.uid, k -> new HashSet<>()).add(p);

m.computeIfAbsent(p.phone, k -> new HashSet<>()).add(p);

}, (a, b) -> b.forEach((key, set) -> {

a.computeIfAbsent(key, k -> new HashSet<>()).addAll(set));

});

它使用的重载collect方法的行为与我上面建议的语句相同。

以上是 Java 8并行流并发分组 的全部内容, 来源链接: utcz.com/qa/399294.html

回到顶部