2016-02-04 112 views
4

我有一個用例,我必須返回一個至少有1個元素的集合。傳入的集合可能有0個或更多元素。Java 8地圖集合,並添加一個默認值,如果集合爲空

所以這可能是很容易做到

Set<ObjectB> setOfB = collectionOfA.isEmpty() ? 
     new HashSet<ObjectB>() {{ add(new ObjectB()); }} : 
     collectionOfA 
      .stream() 
      .map(item -> new ObjectB(item)) 
      .collect(Collectors.toSet()); 

但....

我也想用這個作爲一個機會,以便更好地與Java 8的工具和功能熟悉自己,所以我試圖看看這是否可以在沒有條件測試的情況下以更類似於Java 8的方式完成。

想法和建議非常感謝!

回答

4

我想你已經儘可能地簡單了。請記住,Java 8仍然是相同的語言;不要過度努力使所有的功能。

我會對你的代碼做的一個改進就是使用Collections.singleton(new ObjectB())而不是尷尬和有問題的雙括號初始化。

3

您必須具備條件,因爲計數僅在您調用縮減操作時可用。然而,對於單個元素設定,你可以這樣做:

Set<ObjectB> setOfB = collectionOfA.isEmpty() ? 
    Stream.of(new ObjectB()).collect(Collectors.toSet()) : 
    collectionOfA 
     .stream() 
     .map(item -> new ObjectB(item)) 
     .collect(Collectors.toSet()); 

這可以減少到

Set<ObjectB> setOfB = (collectionOfA.isEmpty() ? 
      Stream.of(new ObjectB()) : 
      collectionOfA.stream().map(item -> new ObjectB(item))) 
     .collect(Collectors.toSet())