我有一个Map<String, List<StartingMaterial>>,我想将列表中的对象转换为另一个对象。即。Map<String, List<StartingMaterialResponse>>
我可以使用java流Collectors.toMap()来完成这个任务吗?
我尝试了下面的代码。
Map<String, List<StartingMaterial>> startingMaterialMap = xxxx;
startingMaterialMap.entrySet().stream().collect(Collectors.toMap( Map.Entry::getKey, Function.identity(), (k, v) -> convertStartingMaterialToDto(v.getValue())));更改对象的转换代码如下所示,
private StartingMaterialResponse convertStartingMaterialToDto(StartingMaterial sm) {
final StartingMaterialMatrix smm = sm.getStartingMaterialMatrix();
final StartingMaterial blending1Matrix = smm.getBlending1Matrix();
final StartingMaterial blending2Matrix = smm.getBlending2Matrix();
return new StartingMaterialResponse(
sm.getId(),
sm.getComponent().getCasNumber(),
sm.getDescription(),
sm.getPriority(),
String.join(" : ",
Arrays.asList(smm.getCarryInMatrix().getComponent().getMolecularFormula(),
blending1Matrix != null ? blending1Matrix.getComponent().getMolecularFormula() : "",
blending2Matrix != null ? blending2Matrix.getComponent().getMolecularFormula() : ""
).stream().distinct().filter(m -> !m.equals("")).collect(Collectors.toList())),
smm.getFamily(),
smm.getSplitGroup());
}发布于 2020-01-17 11:47:53
您可以使用toMap收集器,因为您的源是一个映射。但是,您必须遍历所有的值,并将每个值转换为valueMapper中的DTO格式。
Map<String, List<StartingMaterialResponse>> result = startingMaterialMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().stream()
.map(s -> convertStartingMaterialToDto(s)).collect(Collectors.toList())));发布于 2020-01-17 11:48:36
我想你的意思是:
startingMaterialMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().stream()
.map(this::convertStartingMaterialToDto)
.collect(Collectors.toList()))
);发布于 2020-01-17 11:52:02
下面是我处理这个问题的方法:
Map<String, List<Integer>> deposits = new HashMap<>();
deposits.put("first", Arrays.asList(1, 2, 3));
deposits.forEach((depositName, products) -> {
products.stream()
.map(myIntegerProduct -> myIntegerProduct.toString())
.collect(Collectors.toList());
});上面的示例将List<Integer>转换为字符串列表。在您的示例中,convertStartingMaterialToDto方法代替了convertStartingMaterialToDto方法。
forEach方法遍历映射中的每个键值对,并且为键和值参数设置一些名称,使其更具体,并为读取它的每个人保留一个可以理解的代码。在我的示例中:forEach( (depositName, products)) -> depositName是键(在我的例子中是字符串),products是键的值(在我的例子中是整数列表)。
最后,您也将遍历列表,并将每一项map为新类型。
products.stream() .map(myIntegerProduct -> myIntegerProduct.toString())
https://stackoverflow.com/questions/59786684
复制相似问题