2016-07-29 16 views
1

我有一個列表,可以爲空;如何消費可選列表中的每個元素?

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

我想爲消費者處理每個元素。

到目前爲止,我這樣做。

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

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

有沒有簡單或簡明的方式來做到這一點?

+0

爲什麼不簡單'if(list!= null){list.foreach(e - > {});}?'函數式編程風格很酷,但並非必須始終更清晰和更具可讀性。 –

+0

@AdrianShum因爲我已經知道了。謝謝。 –

回答

2

技術上,if (list != null) { list.stream().forEach(e -> {...}); }是在CPU /內存佔用比你的變型方面都更短,更高效。

結構上,如果你有控制權list及其使用的初始化,那麼通常最好使用任Collections.emptyList()代替null(如果你的程序的邏輯允許)或使從一開始就名單Optional。這樣可以節省您每次想要使用清單時進行檢查或創建Optional的必要性。

+0

我喜歡那個CPU/MEM的問題。 +1 –

1

我不確定你可以使它更簡潔。不過,如果你經常使用循環爲空的列表和消費的每個元素的結構,你可以做一個小的類,它做到了這一點:

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

然後,您可以使用一種對列表中的每個元素如下(例如打印在列表中的所有字符串):

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

Consumer<String> consumer = System.out::println; 
Optional.ofNullable(list).ifPresent(ListConsumer.of(consumer)); 
相關問題