【问题标题】:Converting Java List to another using java streams使用 Java 流将 Java 列表转换为另一个列表
【发布时间】:2019-06-12 03:47:26
【问题描述】:

我有一个班级考试

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

【问题讨论】:

  • “更好”是什么意思?
  • 我的意思是使用 Java 流
  • 以后,请明确说明您的要求。我无法通过您的问题知道是否存在性能问题、内存问题、正确性问题......

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


【解决方案1】:

您可以使用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
}

【讨论】:

    【解决方案2】:

    您可以将其简化为:

    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&lt;List&lt;Test&gt;&gt;,所以我建议使用orElse检索一个默认值。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我相信 OP 想要的是 List&lt;Test&gt; 而不是 List&lt;String&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多