Java 8可选asSet()

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的可选中的番石榴风格?

谢谢

Hol*_*ger 7

有一种简单的方法可以将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)

  • @csyperski我不明白为什么你会想要坚持使用与Guava一起使用的这个空的Set + for循环技巧,当你可以简单地在可选项上执行所需的操作(当前在循环内部)时,如果optional是空的,则为默认值 - `return optUser.map(u - > u.isPermitted(getPermissionRequired())).orElse(Boolean.FALSE)`. (3认同)

Lou*_*man 5

您似乎只是在使用,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>).