我有一个用户列表。
class User {
String name;
}我需要按名称对用户进行分组。
List<Set<User>> groupedBy;分组条件是名称相似度,它是某种比较器
Comparator<User> p = new Comparator<User>() {
// some comparison logic
};如何使用Java 8 streams按相似名称对用户进行分组?
我试过使用partitioning,但它有一个不同于我所需的接口。
Map<Boolean, List<User>> collected = users.stream().collect(Collectors.partitioningBy(new Predicate<User>() {
@Override
public boolean test(User user) {
// ...
}
}, Collectors.toList()));发布于 2017-03-01 03:28:35
通常,如果您想通过一个简单的属性进行分组,您可以使用
Map<String,Set<User>> m=users.stream()
.collect(Collectors.groupingBy(User::getName, Collectors.toSet()));然而,如果你有一个复杂的逻辑被表示为一个已经存在的Comparator,例如
Comparator<User> comparator=Comparator.comparing(u -> u.getName(), Collator.getInstance());您可以使用
Map<User,Set<User>> m=users.stream().collect(
Collectors.groupingBy(u -> u, () -> new TreeMap<>(comparator), Collectors.toSet()));根据封装在比较器中的逻辑进行分组。
在这两种情况下,都会得到一个Map,可以使用以下命令将其转换为所需的列表
List<Set<User>> groupedBy = new ArrayList<>(m.values());您也可以将最后一步表示为Collector的一部分,例如
List<Set<User>> groupedBy=users.stream().collect(
Collectors.collectingAndThen(
Collectors.groupingBy(u -> u, () -> new TreeMap<>(comparator), Collectors.toSet()),
m -> new ArrayList<Set<User>>(m.values())));https://stackoverflow.com/questions/42516470
复制相似问题