Java 8可选asSet()
所以我现在已经使用了Guava的Optional一段时间了,我转向Java 8所以我想使用它的Optional类,但它没有我最喜欢的方法来自Guava,asSet()。 有没有办法用Java 8 Optional来做到这一点,我没有看到。 我喜欢将可选项视为一个集合,所以我可以这样做:
for( final User u : getUserOptional().asSet() ) { return u.isPermitted(getPermissionRequired()); }
在某些情况下,避免需要额外的变量。
IE
Optional optUser = getUserOptional(); if ( optUser.isPresent() ) { return optUser.get().isPermitted(getPermissionRequired()); }
有没有一种简单的方法可以在Java 8的Optional中复制Guava风格?
谢谢
有一种将Optional
转换为Set
的简单方法。 它的工作原理与Optional
任何其他转换一样:
给定一个Optional
您可以调用
o.map(Collections::singleton).orElse(Collections.emptySet())
得到一个Set
。 如果您不喜欢在每种情况下调用Collections.emptySet()
的想法,您可以将其转换为惰性求值:
o.map(Collections::singleton).orElseGet(Collections::emptySet)
然而,这种方法太过微不足道,无法产生性能差异。 所以这只是编码风格的问题。
您也可以使用它按预期迭代:
for(T t: o.map(Collections::singleton).orElse(Collections.emptySet())) // do something with t, may include a return statement
您似乎只使用asSet
因此您可以编写for循环,但这在Java 8中是不必要的。而不是您的代码
Optional optUser = getUserOptional(); if ( optUser.isPresent() ) { return optUser.get().isPermitted(getPermissionRequired()); }
你可以写
getUserPresent().map(optUser -> optUser.isPermitted(getPermissionRequired())) .orElse(false);
…或者,在许多情况下,您可以使用Optional.ifPresent(Consumer
。
你可以使用map
:
return optUser.map(u -> u.isPermitted(getPermissionRequired()));
但它会返回一个Optional
。
参考
public可选地图(function映射器)
如果存在值,则将提供的映射函数应用于该值,如果结果为非null,则返回描述结果的Optional。 否则返回一个空的Optional。
我也没有看到一种非常优雅,内置的方式来做到这一点,但是想提出类似于Dici的解决方案:
public static Set asSet(Optional opt) { return opt.isPresent() ? Collections.singletonSet(opt.get()) : Collections.emptySet(); }
这样可以避免创建新的HashSet
实例并插入可选对象。 (注意:这基本上是Guavas Present
和Absent
类所做的“内联”版本: Present
类返回singletonSet
, Absent
类返回emptySet
)。
用法与原始模式类似:
for( final User u : asSet(getUserOptional()) ) { return u.isPermitted(getPermissionRequired()); }
您可以修改getUserOptional,以便它返回Set或实现您自己的asSet方法:
public Set getUserOptional() { Optional optUser; //your code Set result = new HashSet<>(); if (optUser.isPresent()) result.add(optUser.get()); return result; }
要么
public static Set asSet(Optional opt) { Set result = new HashSet<>(); if (opt.isPresent()) result.add(opt.get()); return result; }
我不知道是否有内置的方法来做到这一点。