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您可以调用

 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 PresentAbsent类所做的“内联”版本: Present类返回singletonSetAbsent类返回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; } 

我不知道是否有内置的方法来做到这一点。