2016-07-29 14 views
1

Ich habe eine Liste, die Null sein kann;Wie kann ich für jedes Element einer optionalen Liste konsumieren?

List<T> list; // may or may not null 

Ich möchte für jedes Element mit einem Verbraucher verarbeiten.

Bis jetzt tue ich.

ofNullable(list) 
     .map(List::stream) 
     .ifPresent(stream -> stream.forEach(e -> {})); 

oder

ofNullable(eventDataList).ifPresent(v -> v.forEach(e -> {})); 

Gibt es eine einfache oder prägnante Art und Weise, dies zu tun?

+0

warum nicht einfach 'if (list! = Null) {list.foreach (e -> {});}?' Funktionaler Programmierstil ist cool, aber nicht notwendig, um immer sauberer und lesbarer zu sein. –

+0

@AdrianShum Weil ich das schon gewusst habe. Vielen Dank. –

Antwort

2

Technisch if (list != null) { list.stream().forEach(e -> {...}); } ist kürzer und effizienter in Bezug auf CPU/Speichernutzung als Ihre Varianten.

Architektonisch, wenn Sie die Kontrolle über die Initialisierung der list und seine Verwendung haben, ist es oft besser, verwenden entweder Collections.emptyList() statt null (wenn die Logik des Programms erlaubt) oder die Liste machen Optional von Anfang an. Das würde Sie vor der Notwendigkeit bewahren, Prüfungen durchzuführen oder Optional s jedes Mal zu erstellen, wenn Sie die Liste verwenden möchten.

+0

Ich mag diese CPU/MEM Sorge. +1 –

1

Ich bin mir nicht sicher, ob Sie es prägnanter machen können. wenn Sie häufig sind jedoch das Konstrukt von Schleifen über eine Nullable-Liste verwenden und jedes Element raubend, könnten Sie eine kleine Klasse machen, die gerade das tut:

public class ListConsumer { 
    public static <H> Consumer<List<H>> of(Consumer<H> consumer) { 
     return hs -> hs.forEach(consumer); 
    } 
} 

Sie können dann jedes Element in einer Liste verbrauchen wie folgt (zB Druck alle Strings in der Liste):

List<String> list = Arrays.asList("A", "B", "C"); 

Consumer<String> consumer = System.out::println; 
Optional.ofNullable(list).ifPresent(ListConsumer.of(consumer)); 
Verwandte Themen