2017-02-17 16 views
1

Я хочу использовать трюки Java 8, чтобы сделать следующее в одной строке.Java8 Преобразование списка объектов в список одного атрибута объекта

Учитывая это определение объекта:

@Getter 
@Setter 
@NoArgsConstructor 
@AllArgsConstructor 
public class MyObj { 
    private String id; 
    private Double value; 
} 

и List<MyObj> objects, я хочу, чтобы получить List<String> objectIds который представляет собой список всех id с объектов в первом списке - в том же порядке.

Я могу сделать это, используя цикл на Java, но я считаю, что в Java8 должна быть однострочная лямбда, которая может это сделать. Я не смог найти решение в Интернете. Возможно, я не использовал правильные условия поиска.

Может ли кто-нибудь предложить лямбду или другой лайнер для этого преобразования?

+0

условия поиска для этого не 'lambda', а 'stream api'. здесь много ответов. – pvg

+0

Что все эти аннотации? 'Getter'? 'Setter'? – user2357112

+0

Это из Ломбока? –

ответ

5

Это должно сделать трюк:

objects.stream().map(MyObj::getId).collect(toList());

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

Как указано в комментариях, поток сохраняет заказ.

+0

Я сначала заказываю список в порядке убывания 'value', используя' objects.sort ((o1, o2) -> (int) (o1.getValue() - o2.getValue())) '. Затем мне нужно извлечь только объекты, чтобы перейти в другую функцию без изменения порядка. Если этот метод не гарантирует порядок, я не могу рисковать использовать его. – Nik

+1

На это http://stackoverflow.com/a/29218074/539864 кажется, что в списках порядок гарантирован – xiumeteo

+3

@Nik, что компаратор лучше написан 'objects.sort (Comparator.comparingInt (MyObj :: getValue))'. Но да, заказ гарантирован. –