我有一个用例,我必须返回一个至少包含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的方式。
非常感谢您的意见和建议!
答案 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())