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

时间:2018-06-29 11:46:52

标签: 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);
}

3 个答案:

答案 0 :(得分:7)

只需收集一次即可:

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

答案 1 :(得分:1)

您可以通过多行lambda和其他地图操作来实现:

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

答案 2 :(得分:1)

无需mapString,然后回到SomeClass,在一张地图中进行操作:

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