Java 如何从倍数列表复制所有值<;DTO1>;到单个列表<;DTO2>;
对不起我的英语 我有三个Java 如何从倍数列表复制所有值<;DTO1>;到单个列表<;DTO2>;,java,list,collections,hashmap,java-stream,Java,List,Collections,Hashmap,Java Stream,对不起我的英语 我有三个列表: 我想制作第三个列表,其中包含3个列表的count属性的值。 以下是我想要的: List D: ListD{id=5, userLogin='cdp', countListA=14, countListB=26, countListC=29} ListD{id=11452, userLogin='clelonginge', countListA=7, countListB=14, countListC=45} ListD{id=11451, userLogin='
列表
:
我想制作第三个列表
,其中包含3个列表的count属性的值。
以下是我想要的:
List D:
ListD{id=5, userLogin='cdp', countListA=14, countListB=26, countListC=29}
ListD{id=11452, userLogin='clelonginge', countListA=7, countListB=14, countListC=45}
ListD{id=11451, userLogin='vdupontinge', countListA=16, countListB=6, countListC=75}
所以我尝试了不同的方法,比如:
ListC = ListA.stream().map(DTO1::getId).collect(Collectors.toList());
(it gave me the following error:
Error:(475, 98) java: incompatible types: inference variable T has incompatible bounds
equality constraints: org.ocdm.service.dto.DTO2
lower bounds: java.lang.Long
)
或者使用HashMap,但我没有找到解决方案
编辑:
ListA、ListB和ListC是相同的类型。它们的类型为:
List
但是清单D是不同的。它的类型为:List.
DTO1有3个属性:id、userLogin和count
DT02有5个属性:id、userLogin、countListA、countListB和countListC。如果您知道
id
是唯一的(没有两个id
s具有不同的userLogin
s),那么将map作为中介可能会有所帮助
首先,您必须从一个列表创建地图。假设它是listA
:
Map<Integer, DTO2> map = listA.stream().collect(Collectors.toMap(item->item.getId(),
item->new DTO2(item.getId(), item.getUserLogin(), item.getCount(), 0,0)));
请注意,merge()
需要一个函数。如果item.setCountListB()
不返回任何内容,则需要在第三个参数中显式返回值。或者,您可以将其声明为DTO2 setCountListB()
——这是不寻常的,但也是可能的
然后合并最后一个列表。注意,我们将count作为构造函数中的第5个参数传递
listC.forEach(itemC -> map.merge(
itemC.getId(),
new DTO2(itemC.getId(), itemC.getUserLogin(), 0, 0,itemC.getCount()),
(existingItem, noMatter) -> {existingItem.setCountListC(itemC.getCount()); return existingItem;}));
最后,返回List
,而不是Map
return map.values().stream().collect(Collectors.toList());
注意,代码依赖于构造函数按特定顺序接收countA
、countB
和countC
。这可能会让人困惑,可能您想要使用构建器模式,但它超出了范围
从性能的角度来看,代码可能并不完美,但您已经知道了。ListA、ListB、ListC是不同的Java类型吗?ListA、ListB和ListC是相同的类型。它们的类型为:List。但是清单D是不同的。它的类型为:List。DTO1有3个属性:id、userLogin和count。DT02有5个属性:id、userLogin、countListA、countListB和countListC。我想在这里这样做比使用streams、map和Collector更有意义。你的意思是在所有列表中循环吗?实际上,我简化了我的示例以便您理解它,但是我的表有很多行和更多列。所以我认为这会减慢我的应用程序。你知道流是如何工作的吗
ListC=ListA.stream().map(DTO1::getId).collect(Collectors.toList())代码>告诉我你没有。也许先从那里开始?好的,谢谢你。我要试试你刚才告诉我的!祝你一切顺利@sinaardehali不客气。如果答案解决了你的问题,别忘了接受它
listC.forEach(itemC -> map.merge(
itemC.getId(),
new DTO2(itemC.getId(), itemC.getUserLogin(), 0, 0,itemC.getCount()),
(existingItem, noMatter) -> {existingItem.setCountListC(itemC.getCount()); return existingItem;}));
return map.values().stream().collect(Collectors.toList());