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

sli*_*der 2 java lambda java-8

有没有办法只使用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);
}
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 7

只需一次收集:

List<SomeClass> someList2 = 
someList1.stream()
         .map(i -> {                    
                    SomeClass someObj = new SomeClass();
                    someObj.setField(i.getField());  
                    return someObj;
                  }
         )
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但请注意,如果构造函数SomeClass接受其值getField(),那么它将更加整洁:

List<SomeClass> someList2 = 
someList1.stream()
         .map(i-> new SomeClass(i.getField())
         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者通过map()在两个不同的转换中拆分操作,您可以使用方法引用,这提高了可读性:

List<SomeClass> someList2 = 
someList1.stream()
         .map(OneClass::getField)
         .map(SomeClass::new)
         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)