有没有办法仅对lambdas执行以下代码?
// translate someList1 to someList3
// .. get sublist
List<String> someList2 = someList1.stream()
.map(i -> i.getField())
.collect(Collectors.toList());
// .. create new (target) list
List<SomeClass> someList3 = new ArrayList<>();
for (String item : someList2) {
SomeClass someObj = new SomeClass();
someObj.setField(item);
someList3.add(someObj);
}
答案 0 :(得分:7)
只需收集一次即可:
List<SomeClass> someList2 =
someList1.stream()
.map(i -> {
SomeClass someObj = new SomeClass();
someObj.setField(i.getField());
return someObj;
}
)
.collect(Collectors.toList());
但是请注意,如果SomeClass
中的构造函数接受getField()
的值,那实际上会更整洁:
List<SomeClass> someList2 =
someList1.stream()
.map(i-> new SomeClass(i.getField())
.collect(Collectors.toList());
或者通过将map()
操作分为两个不同的转换,可以使用方法引用,这可以提高可读性:
List<SomeClass> someList2 =
someList1.stream()
.map(OneClass::getField)
.map(SomeClass::new)
.collect(Collectors.toList());
答案 1 :(得分:1)
您可以通过多行lambda和其他地图操作来实现:
List<SomeClass> someList3 = someList1.stream()
.map(i -> i.getField())
.map(f -> {
SomeClass someObj = new SomeClass();
someObj.setField(f);
return someObj;
})
.collect(Collectors.toList());
答案 2 :(得分:1)
无需map
到String
,然后回到SomeClass
,在一张地图中进行操作:
List<SomeClass> someList2 = list.stream()
.map(i -> new SomeClass(i.getField())) //in case you have such constructor
.collect(Collectors.toList());