所以我使用 Guava 的 Optional
有一段时间了,现在我正在转向 Java 8,所以我想使用它的 Optional
类,但它没有没有我最喜欢的 Guava 方法:asSet()
。有没有办法用我没有看到的 Java 8 Optional
来做到这一点。我喜欢能够将 Optional
视为一个集合,所以我可以这样做:
for (final User u : getUserOptional().asSet()) {
return u.isPermitted(getPermissionRequired());
}
在某些情况下避免了对额外变量的需要。
例如:
Optional<User> optUser = getUserOptional();
if (optUser.isPresent()) {
return optUser.get().isPermitted(getPermissionRequired());
}
有没有一种简单的方法可以在 Java 8 的 Optional
中复制 Guava 样式?
谢谢
最佳答案
有一种转换 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
关于Java 8 可选的 asSet(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219277/