[英]Converting Java List to another using java streams
我有一堂課
public class Test{
String codes;
String field 1;
....
String field n;
}
我有一個測試對象列表
List<Test> objects, code can be one or more with a comma separated
testObj1("A", "field1".."fieldn")
testObj2("B,C", ...)
testObj3("D,E,F", ....)
testObj4("G", ...)
嘗試通過保留其余字段將此list1
轉換為新list2
,每個代碼A,B,C ...到其自己的對象。
List<Test>
testObj1("A", ....)
testObj2("B", ....)
testObj3("C", ....)
list1.stream().collect(Collectors.toList())
我使用循環(Sudo代碼)實現了這一點,但尋找更好的邏輯
for(loop thru list1){
String[] codesArr = testObj1.codes.split(",");
for (String code : codesArr) {
//Create new Obj
Test obj = new Test(code, testObj1.copyotherfields);
//Add obj to list2
}
}
您可以將Stream.map
與flatMap
一起使用:
List<Test> finalList = list1.stream()
.flatMap(e -> Arrays.stream(e.getCodes().split(","))
.map(c -> new Test(c, e.getField1(), e.getFieldn())))
.collect(Collectors.toList());
這假設您的Test
類將具有類似於以下實現的構造函數:
class Test {
String codes;
String field1;
String fieldn;
// would vary with the number of 'field's
Test(String codes, String field1, String fieldn) {
this.codes = codes;
this.field1 = field1;
this.fieldn = fieldn;
}
// getters and setters
}
您可以將其簡化為:
List<Test> copy = list.stream()
.map(e -> Arrays.stream(e.codes.split(""))
.map(c -> new Test(c, e.otherField))
.collect(Collectors.toList()))
.findAny().orElse(...);
這將流經給定列表,然后通過split()
的Array
流並映射到新的Test
對象並將其收集到List
。 它通過findAny()
檢索它,它返回一個Optional<List<Test>>
,因此我建議使用orElse
來檢索默認值。
你可以使用map
函數然后flatMap
它就像這樣:
List<String> testList = Arrays.asList("one,two,three,four", "five", "six", "seven",
"eight, nine", "ten");
List<String> reMappedList = testList.stream()
.map(s -> {
String[] array = s.split(",");
return Arrays.asList(array);
})
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(reMappedList);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.