所以我现在已经使用Guava的Optional一段时间了,我转到Java 8所以我想使用它的Optional类,但它没有我最喜欢的方法来自Guava,asSet()。有没有办法用Java 8 Optional来做到这一点,我没有看到。我喜欢将可选项作为集合处理,所以我可以这样做:
for( final User u : getUserOptional().asSet() ) {
return u.isPermitted(getPermissionRequired());
}
在某些情况下,无需额外的变量。
IE
Optional<User> optUser = getUserOptional();
if ( optUser.isPresent() ) {
return optUser.get().isPermitted(getPermissionRequired());
}
是否有一种简单的方法可以在Java 8的Optional中复制Guava样式?
由于
答案 0 :(得分:6)
有一种将Optional
转换为Set
的简单方法。它就像Optional
的任何其他转换一样工作:
给定Optional<T> o
你可以调用
o.map(Collections::singleton).orElse(Collections.emptySet())
获得Set<T>
。如果您不喜欢在每种情况下调用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
答案 1 :(得分:5)
您似乎只使用asSet
,因此您可以编写for循环,但在Java 8中这是不必要的。而不是您的代码
Optional<User> optUser = getUserOptional();
if ( optUser.isPresent() ) {
return optUser.get().isPermitted(getPermissionRequired());
}
你可以写
getUserPresent().map(optUser -> optUser.isPermitted(getPermissionRequired()))
.orElse(false);
...或者,在许多情况下,您可以使用Optional.ifPresent(Consumer<T>)
。
答案 2 :(得分:2)
您可以使用map
:
return optUser.map(u -> u.isPermitted(getPermissionRequired()));
但它会返回Optional<WhateverTypeIsPermittedReturns>
。
public可选地图(功能映射器)
如果存在值,请将提供的映射函数应用于该值,然后 如果结果为非null,则返回描述结果的Optional。 否则返回一个空的Optional。
答案 3 :(得分:1)
我也没有看到一种非常优雅,内置的方法来做到这一点,但我想提出类似于Dici的解决方案:
public static <T> Set<T> asSet(Optional<T> opt) {
return opt.isPresent() ?
Collections.singletonSet(opt.get()) :
Collections.emptySet();
}
这可以避免创建新的HashSet
实例并插入可选对象。 (注意:这基本上是Guavas Present
和Absent
类所做的&#34;内联和#34;版本:Present
类返回singletonSet
,并且Absent
类返回emptySet
)。
用法与原始模式类似:
for( final User u : asSet(getUserOptional()) ) {
return u.isPermitted(getPermissionRequired());
}
答案 4 :(得分:0)
您可以修改getUserOptional,使其返回Set或实现您自己的asSet方法:
public Set<User> getUserOptional() {
Optional<User> optUser;
//your code
Set<User> result = new HashSet<>();
if (optUser.isPresent())
result.add(optUser.get());
return result;
}
或
public static <T> Set<T> asSet(Optional<T> opt) {
Set<T> result = new HashSet<>();
if (opt.isPresent())
result.add(opt.get());
return result;
}
我不知道是否有内置方法可以做到。
答案 5 :(得分:0)
另一种选择是:
getUserOptional().stream().collect(Collectors.toSet())
我不相信这更好,但只是想在这里添加它以保持完整性。