为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2022-05-12 15:59:47
我有一个班级测试public class Test{  String codes;  String field 1;  ....  String field n;}我有一个测试对象列表List<Test> objects, code can be one or more with a comma separatedtestObj1("A", "field1".."fieldn")testObj2("B,C", ...)testObj3("D,E,F", ....)testObj4("G", ...)尝试通过保留剩余字段将其转换list1为新的,每个代码 A、B、C... 到它自己的对象。list2List<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 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以使用Stream.mapas 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

}


查看完整回答
反对 回复 2022-05-12
?
达令说

TA贡献1821条经验 获得超6个赞

您可以将其简化为:

List<Test> copy = list.stream()
                      .map(e -> Arrays.stream(e.codes.split(""))            
                                      .map(c -> new Test(c, e.otherField))
                     .collect(Collectors.toList()))
                     .findAny().orElse(...);

它将流过给定的列表,然后流过Arrayyield fromsplit()并映射到一个新Test对象并将其收集到一个List. 它通过 检索它findAny(),它返回一个Optional<List<Test>>,所以我建议使用orElse它来检索默认值。


查看完整回答
反对 回复 2022-05-12
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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


查看完整回答
反对 回复 2022-05-12
  • 3 回答
  • 0 关注
  • 275 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信