关于stream的问题

cpp_1 2020-11-22 07:52:33
1。 List<obj1> aa=xxxxxx;
2. List<obj2> bb=xxxxx;

obj1 类:

print int id;
print int name;


obj2 类:
print int id;
print int p_name;

print List<obj2> list;


比如我aa里面有10个数据,BB里面有20个数据值全在list属性上面。

我现在要做的:
循环二个bb.getlist(),通过ID=AA.ID,后把找到的name赋值给bb.getlist.p_name属性

要用steam方式,我写到一半就写不下去了。

我用
bb.steam().filter(x->aa.steam().filter( y-> x.getid==y.getid)).foreach(x->x.setp_name(y.getname)

好像这样写会出错。。
...全文
8151 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpp_1 2020-11-24
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
要用foreach而不是filter,filter是筛选,foreach是针对每个元素做处理 bb.stream().forEach(b->{ AA a=aa.stream().filter(e->e.id==b.id).get(); if(a!=null) { b.p_name=a.name; } });
这个里面找到get() ,只有.findFirst ( ).get ( ) 要么就提示'Optional.get()' 未进行 'isPresent()' 检查 要么就直接报错了:o value present
qybao 2020-11-24
  • 打赏
  • 举报
回复
引用 4 楼 cpp_1 的回复:
这个里面找到get() ,只有.findFirst ( ).get ( )
要么就提示'Optional.get()' 未进行 'isPresent()' 检查
要么就直接报错了:o value present


嗯,当时写完就发现这个错了,不过觉得你应该能知道意思(知道这个思路),所以也就不改了
为什么会报 o value present 错误?因为filter符合条件可能有多条(甚至是没有),所以不能直接get,要判断一下
bb.stream().forEach(b->{
Optional<AA> a=aa.stream().filter(e->e.id==b.id).findAny();
if(a.isPresent()) {
b.p_name=a.get().name;
}
});
苏颙 2020-11-23
  • 打赏
  • 举报
回复
引用 2 楼 苏颙 的回复:
两层循环时间复杂度较高,建议先用hash表

Map obj1Map = aa.stream().collect(Collectors.toMap(obj1::getId,obj1::getName));
bb.stream.filter(x->obj1Map.get(x.getId) != null).forEach(x->x.setPName(obj1Map.get(x.getId)));
少了个 filter
苏颙 2020-11-23
  • 打赏
  • 举报
回复
两层循环时间复杂度较高,建议先用hash表

Map obj1Map = aa.stream().collect(Collectors.toMap(obj1::getId,obj1::getName));
bb.stream.forEach(x->x.setPName(obj1Map.get(x.getId)));
qybao 2020-11-23
  • 打赏
  • 举报
回复
要用foreach而不是filter,filter是筛选,foreach是针对每个元素做处理 bb.stream().forEach(b->{ AA a=aa.stream().filter(e->e.id==b.id).get(); if(a!=null) { b.p_name=a.name; } });

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧