使用Java流将Java列表转换为另一个

时间:2019-01-17 21:21:09

标签: java arraylist collections java-8 java-stream

我有一个测验班

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
  }
}

3 个答案:

答案 0 :(得分:3)

您可以将Stream.mapflatMap一起使用:

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
}

答案 1 :(得分:0)

您可以将其简化为:

Activity

将流式处理给定列表,然后流式传输从checkSelfPermission()产生的List<Test> copy = list.stream() .map(e -> Arrays.stream(e.codes.split("")) .map(c -> new Test(c, e.otherField)) .collect(Collectors.toList())) .findAny().orElse(...); 并映射到新的Array对象,并将其收集到split()。它通过Test检索它,它返回一个List,所以我建议使用findAny()来检索默认值。

答案 2 :(得分:-1)

您可以先使用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);