如何使用具有java流属性的不同对象列表创建不同对象的列表
我在为一组数据创建逻辑数据时遇到了一个算法问题,如下所示:如何使用具有java流属性的不同对象列表创建不同对象的列表,java,algorithm,java-stream,distinct,Java,Algorithm,Java Stream,Distinct,我在为一组数据创建逻辑数据时遇到了一个算法问题,如下所示: |-------|--------| | id | ctx_id | |-------|--------| | 1 | 1001 | | 1 | 1002 | | 1 | 1003 | | 1 | 1004 | | 2 | 2001 | | 2 | 2002 | | 2 | 2003 | ------------------ 这是我从数据库中获得
|-------|--------|
| id | ctx_id |
|-------|--------|
| 1 | 1001 |
| 1 | 1002 |
| 1 | 1003 |
| 1 | 1004 |
| 2 | 2001 |
| 2 | 2002 |
| 2 | 2003 |
------------------
这是我从数据库中获得的列表,作为包含id
和ctx\u id
的list
对象。我想要实现的是创建这样的实体的两个对象:
private class UserData {
private long id;
private List<long> contextList;
}
私有类用户数据{
私人长id;
私有列表上下文列表;
}
每个用户都有一个ID和分配给他的上下文。我想要实现的是操作上表中的数据,这样我就可以创建两个UserData
对象,一个包含id=1
和一个包含100110031004
的列表,第二个UserData
对象,包含id=2
和一个包含20022003
的列表
我怎样才能做到这一点?我尝试在
流()上使用filter()
,在这个列表
对象上使用filter()
,但没有付出任何努力…第一步是使用id
上的分组将用户上下文
收集到地图
。然后将该映射流化并将每个条目转换为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();
Collectio usersData=usersContexts.stream()
.map(u->newuserdata(u.getId(),newarraylist(singletonList(u.getCtx_id())))
.collect(Collectors.toMap(UserData::getId,Function.identity(),
(o,o2)->{o.getContextList().addAll(o2.getContextList());返回o;})
.values();
查看groupingBy
例如,刚才在中所述。尝试一下,如果有什么问题不起作用,请写回这里编辑问题。至于现在,这需要更多的关注。@dziki您可以使用单流。