繁体   English   中英

如何使用具有使用 java 流的属性的不同对象的列表创建不同对象的列表

[英]How to create a list of distinct objects using list of different objects having properties using java streams

我在为这样的一组数据创建逻辑时遇到了一个算法问题:

|-------|--------|
|  id   | ctx_id |
|-------|--------|
|   1   |  1001  |
|   1   |  1002  |
|   1   |  1003  |
|   1   |  1004  |
|   2   |  2001  |
|   2   |  2002  |
|   2   |  2003  |
------------------

这是我从数据库中获取的列表,作为包含idctx_idList<UsersContexts>对象。 我想要实现的是创建这样的实体的两个对象:

private class UserData {
    private long id;
    private List<long> contextList;
}

每个用户都有一个 ID 和分配给他的上下文。 我想要实现的是操作上表中的数据,以便我可以创建两个UserData对象,一个包含id = 1和一个包含1001, 1002, 1003, 1004的列表,以及第二个UserData对象,包含id = 2和包含2001, 2002, 2003的列表。

我怎样才能做到这一点? 我尝试在这个List<UsersContexts>对象上的stream()上使用filter() ,但毫不费力......

第一步是使用Collectors.groupingByid分组将UsersContexts收集到Map<Integer, List<Integer>> 然后流式传输该映射并将每个条目转换为UserData

    usersContexts.stream()
                 .collect(Collectors.groupingBy(UsersContexts::getId, 
                         Collectors.mapping(UsersContexts::getCxtId, Collectors.toList())))
                 .entrySet()
                 .stream()
                 .map(entry->new UserData(entry.getKey(), entry.getValue()))
                 .collect(Collectors.toList());

您可以将map()函数和toMap()收集器与合并函数一起使用。

Collectio<UserData> usersData = usersContexts.stream()
      .map(u -> new UserData(u.getId(), new ArrayList<>(singletonList(u.getCtx_id()))))
      .collect(Collectors.toMap(UserData::getId, Function.identity(),
                 (o, o2) -> { o.getContextList().addAll(o2.getContextList());return o; }))
      .values();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM