Załóżmy, że mamy listę w następujący sposób. CoreResult
ma pole typu List<Double>
.3 sposoby spłaszczania listy list. Czy istnieje powód, aby preferować jedno z nich?
final List<CoreResult> list = new LinkedList<>(SOME_DATA);
Celem jest spłaszczyć listę po ekstrakcji tego konkretnego pola z każdego obiektu CoreResult
. Oto 3 możliwe opcje. Czy któryś z nich jest lepszy od innych?
Wariant 1 wyodrębniania pola poprzez map()
i spłaszczenie w środku kolektora
final List<Double> A = list.stream().map(CoreResult::getField)
.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
Wariant 2 wyodrębniania pola poprzez map()
, spłaszczyć poprzez flatMap()
, prosty kolektor
final List<Double> B = list.stream().map(CoreResult::getField)
.flatMap(Collection::stream).collect(Collectors.toList());
Opcja 3: wyodrębnić pole i spłaszczyć za jednym razem flatMap()
, prosty kolektor
final List<Double> C = list.stream().flatMap(
x -> x.getField().stream()).collect(Collectors.toList());
czy odpowiedź byłaby inna, gdyby nie było potrzeby, aby wyodrębnić z CoreResult dowolnego pola, a zamiast tego ktoś chciał po prostu spłaszczyć List<List<Double>>
?
Jeśli zależy Ci na wydajności, nie powinieneś używać 'LinkedList'. A ponieważ 'SOME_DATA' musi już być kolekcją, nie ma sensu kopiowanie jej do innej' Listy'. Tak więc preferowaną metodą jest 'SOME_DATA.stream()./* niezależnie od trzech opcji, które lubisz */'... – Holger