2016-07-18 11 views
9

Mam dość duży potok strumieniowy, dlatego chciałbym, aby był czysty. Mam następujący część większej rurociąguCollector powracający singletonList jeśli toList zwrócił pustą listę

Integer defaultInt; 
//... 
Stream<Integer> ints; 
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector); 

Gdzie toSingletonIfEmptyCollector jest podobno działają tak samo jak Collectors.toList() robi jeśli zwraca non-emtpy listę i Collections.singletonList(defaultInt) jeśli Collectors.toList() wrócił pusty.

Czy istnieje krótszy sposób na jego wdrożenie (np. Poprzez komponowanie standardowych kolektorów dostarczonych w JDK), a następnie wdrożenie całej metody Collector od zera?

+2

Zakładam, że nie mutują wynikowej liście. –

+1

Istnieje kilka metod pomocniczych, które mogą być przydatne w 'IntStream' nad' Stream '. ** Uwaga: ** 'IntStream' to * prymitywny strumień * (tylko mała wskazówka) –

Odpowiedz

15

Można użyć collectingAndThen i wykonać dodatkową operację finiszera na wbudowanym kolektorze toList(), który zwróci listę singleton na wypadek, gdyby nie było żadnych elementów.

static <T> Collector<T, ?, List<T>> toList(T defaultValue) { 
    return Collectors.collectingAndThen(
       Collectors.toList(), 
       l -> l.isEmpty() ? Collections.singletonList(defaultValue) : l 
      ); 
} 

by być stosowany tak:

System.out.println(Stream.of(1, 2, 3).collect(toList(5))); // prints "[1, 2, 3]" 
System.out.println(Stream.empty().collect(toList(5))); // prints "[5]" 
+0

Świetnie, dokładnie tego chciałem, dziękuję. – user3663882

+3

Wolę nazwać niestandardowy kolektor z czymś bardziej szczegółowym, np. 'ToListOrDefault' specjalnie, że jest statyczny, boi się spowodować zamieszanie z' Collectors.toList', szczególnie jeśli używane są statyczne importowanie. –

Powiązane problemy