首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:如何使用Stream API按条件对实体进行分组?

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

Stack Overflow用户
提问于 2017-03-01 02:45:52
回答 1查看 3.2K关注 0票数 1

我有一个用户列表。

代码语言:javascript
运行
复制
class User {
    String name;
}

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

代码语言:javascript
运行
复制
List<Set<User>> groupedBy;

分组条件是名称相似度,它是某种比较器

代码语言:javascript
运行
复制
Comparator<User> p = new Comparator<User>() {
    // some comparison logic
};

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

我试过使用partitioning,但它有一个不同于我所需的接口。

代码语言:javascript
运行
复制
Map<Boolean, List<User>> collected = users.stream().collect(Collectors.partitioningBy(new Predicate<User>() {
    @Override
    public boolean test(User user) {
        // ...
    }
}, Collectors.toList()));
EN

回答 1

Stack Overflow用户

发布于 2017-03-01 03:28:35

通常,如果您想通过一个简单的属性进行分组,您可以使用

代码语言:javascript
运行
复制
Map<String,Set<User>> m=users.stream()
    .collect(Collectors.groupingBy(User::getName, Collectors.toSet()));

然而,如果你有一个复杂的逻辑被表示为一个已经存在的Comparator,例如

代码语言:javascript
运行
复制
Comparator<User> comparator=Comparator.comparing(u -> u.getName(), Collator.getInstance());

您可以使用

代码语言:javascript
运行
复制
Map<User,Set<User>> m=users.stream().collect(
    Collectors.groupingBy(u -> u, () -> new TreeMap<>(comparator), Collectors.toSet()));

根据封装在比较器中的逻辑进行分组。

在这两种情况下,都会得到一个Map,可以使用以下命令将其转换为所需的列表

代码语言:javascript
运行
复制
List<Set<User>> groupedBy = new ArrayList<>(m.values());

您也可以将最后一步表示为Collector的一部分,例如

代码语言:javascript
运行
复制
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())));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42516470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档