有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java只使用流收集结果(不使用外部循环)

有没有办法只使用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);
}

共 (3) 个答案

  1. # 1 楼答案

    无需map将其转换为String然后返回SomeClass,在一个映射中执行此操作:

     List<SomeClass> someList2 = list.stream()
                .map(i -> new SomeClass(i.getField())) //in case you have such constructor 
                .collect(Collectors.toList());
    
  2. # 2 楼答案

    您可以通过多行lambda和另一个映射操作来实现这一点:

    List<SomeClass> someList3 = someList1.stream()
        .map(i -> i.getField())
        .map(f -> {
            SomeClass someObj = new SomeClass();
            someObj.setField(f);
            return someObj;
        })
        .collect(Collectors.toList());
    
  3. # 3 楼答案

    只需一次收集:

    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());