Java:如何使用Stream API按条件对实体进行分组?

时间:2017-02-28 18:45:52

标签: java group-by streaming java-stream

我有一个用户列表。

class User {
    String name;
}

我需要按名称对用户进行分组。

List<Set<User>> groupedBy;

分组条件是名称相似性,它是一些比较器

Comparator<User> p = new Comparator<User>() {
    // some comparison logic
};

如何使用Java 8流按类似名称对用户进行分组?

我尝试使用partitioning,但它的API不同于我需要的API。

Map<Boolean, List<User>> collected = users.stream().collect(Collectors.partitioningBy(new Predicate<User>() {
    @Override
    public boolean test(User user) {
        // ...
    }
}, Collectors.toList()));

1 个答案:

答案 0 :(得分:3)

通常,如果您想通过简单属性进行分组,则使用

0

但是,如果您有一个复杂的逻辑,表示为已存在的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