Java 8可选asSet()

时间:2014-08-09 13:53:31

标签: java guava java-8 optional

所以我现在已经使用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样式?

由于

6 个答案:

答案 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>

Reference

  

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 PresentAbsent类所做的&#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())

我不相信这更好,但只是想在这里添加它以保持完整性。