csy*_*ski 5 java optional guava java-8
所以我现在已经使用Guava的Optional一段时间了,我转向Java 8,所以我想使用它的Optional类,但它没有我最喜欢的方法来自Guava,asSet().有没有办法用Java 8 Optional执行此操作,我没有看到.我喜欢将可选项视为一个集合,所以我可以这样做:
for( final User u : getUserOptional().asSet() ) {
return u.isPermitted(getPermissionRequired());
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,避免需要额外的变量.
IE
Optional<User> optUser = getUserOptional();
if ( optUser.isPresent() ) {
return optUser.get().isPermitted(getPermissionRequired());
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来复制Java 8的可选中的番石榴风格?
谢谢
有一种简单的方法可以将Optionala 转换为a Set.它的工作方式与以下任何其他转换一样Optional:
鉴于Optional<T> o你可以调用
o.map(Collections::singleton).orElse(Collections.emptySet())
Run Code Online (Sandbox Code Playgroud)
得到一个Set<T>.如果你不喜欢Collections.emptySet()在每种情况下被调用的想法,你可以把它变成一个懒惰的评估:
o.map(Collections::singleton).orElseGet(Collections::emptySet)
Run Code Online (Sandbox Code Playgroud)
然而,这种方法太过微不足道,无法产生性能差异.所以这只是编码风格的问题.
您也可以使用它按预期迭代:
for(T t: o.map(Collections::singleton).orElse(Collections.emptySet()))
// do something with t, may include a return statement
Run Code Online (Sandbox Code Playgroud)
您似乎只是在使用,asSet因此您可以编写for循环,但这在Java 8中是不必要的.而不是您的代码
Optional<User> optUser = getUserOptional();
if ( optUser.isPresent() ) {
return optUser.get().isPermitted(getPermissionRequired());
}
Run Code Online (Sandbox Code Playgroud)
你可以写
getUserPresent().map(optUser -> optUser.isPermitted(getPermissionRequired()))
.orElse(false);
Run Code Online (Sandbox Code Playgroud)
......或者,在许多情况下,你可以使用Optional.ifPresent(Consumer<T>).