如何用Guava简化从两个Optional提取值到ImmutableSet的代码?
简化Optional值提取生成ImmutableSet的写法
这里有两种简洁的写法可以完全替代原有的if-else逻辑:
方法一:利用Stream API(推荐)
这种方式代码最紧凑,利用Java 8引入的Stream结合Optional的stream()方法,自动过滤空值:
private Set<String> getValues(Optional<String> one, Optional<String> two) { return Stream.of(one, two) .flatMap(Optional::stream) .collect(ImmutableSet.toImmutableSet()); }
逻辑说明
Stream.of(one, two)将两个Optional对象包装成StreamflatMap(Optional::stream)会把有值的Optional转为包含对应值的Stream,空Optional则转为空Stream,自动跳过空值- 最后通过
collect(ImmutableSet.toImmutableSet())把所有有效值收集为ImmutableSet,无有效值时返回空的ImmutableSet
方法二:使用ImmutableSet.Builder
如果更习惯Builder模式,也可以用这种方式,通过Optional的ifPresent方法条件添加元素:
private Set<String> getValues(Optional<String> one, Optional<String> two) { ImmutableSet.Builder<String> builder = ImmutableSet.builder(); one.ifPresent(builder::add); two.ifPresent(builder::add); return builder.build(); }
逻辑说明
- 初始化ImmutableSet的Builder实例
- 调用每个Optional的
ifPresent方法,仅当Optional存在值时,才将值添加到Builder中 - 最后调用
build()生成最终的ImmutableSet,空值会被自动忽略
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

