Java 8映射集合,如果集合为空,则添加默认值

时间:2016-02-04 18:16:59

标签: java java-8

我有一个用例,我必须返回一个至少包含1个元素的集合。传入集合可能包含0个或更多元素。

所以这可以很容易地完成

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的方式。

非常感谢您的意见和建议!

2 个答案:

答案 0 :(得分:4)

我认为你已经尽可能简单了。请记住,Java 8仍然是同一种语言;不要试图让一切都运作起来。

我将对您的代码进行的一项改进是使用Collections.singleton(new ObjectB())而不是笨拙且有问题的双括号初始化。

答案 1 :(得分: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())