Соберите результат только с потоком (без использования внешнего цикла) - PullRequest
0 голосов
/ 29 июня 2018

Есть ли способ сделать следующий код только с лямбдами?

// 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 голосов
/ 29 июня 2018

Нет необходимости map до String, затем обратно до SomeClass, сделать это на одной карте:

 List<SomeClass> someList2 = list.stream()
            .map(i -> new SomeClass(i.getField())) //in case you have such constructor 
            .collect(Collectors.toList());
0 голосов
/ 29 июня 2018

Требуется только один сбор:

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());
0 голосов
/ 29 июня 2018

Этого можно добиться с помощью многострочной лямбды и другой операции с картой:

List<SomeClass> someList3 = someList1.stream()
    .map(i -> i.getField())
    .map(f -> {
        SomeClass someObj = new SomeClass();
        someObj.setField(f);
        return someObj;
    })
    .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...