Guava可选类型,当转换返回另一个Optional时

Seb*_*ber 4 java generics guava

我有一种方法可以促成一种方法 Optional<String>

但是,必须在另一个应用程序级别将此String解析为Integer或Long.

我有一个Function<String, Integer>可以应用于String,生成一个Integer.此转换可能会失败,因为String可能不是Integer可解析值.


我希望在转换失败时返回Optional,而不是抛出解析异常.

我无法使STRING_TO_INTEGER_FUNCTION返回null,因为Guava不允许它:

Exception in thread "main" java.lang.NullPointerException: Transformation function cannot return null.
Run Code Online (Sandbox Code Playgroud)

因此,我唯一能做的就是拥有一个,Function<String,Optional<Integer>>但后来我得到了最终的结果,Optional<Optional<Integer>>这并不是很酷,因为我可能有另一个转换应用于它.


有人知道我怎么能在番石榴做那样的事情?

Optional.of("Toto").transform(STRING_TO_INTEGER_FUNCTION) = // Optional<Integer> ?
Run Code Online (Sandbox Code Playgroud)

谢谢

Xae*_*ess 6

我想你可以这样做:

public static void main(final String[] args) {
  final Optional<Integer> valid = Optional.of("42")
      .transform(STR_TO_INT_FUNCTION)
      .or(Optional.<Integer>absent());
  System.out.println(valid); // Optional.of(42)
  final Optional<Integer> invalid = Optional.of("Toto")
      .transform(STR_TO_INT_FUNCTION)
      .or(Optional.<Integer>absent());
  System.out.println(invalid); // Optional.absent()
  final Optional<Integer> absent = Optional.<String>absent()
      .transform(STR_TO_INT_FUNCTION)
      .or(Optional.<Integer>absent());
  System.out.println(absent); // Optional.absent()
}

private static final Function<String, Optional<Integer>> STR_TO_INT_FUNCTION =
    new Function<String, Optional<Integer>>() {
      @Override
      public Optional<Integer> apply(final String input) {
        return Optional.fromNullable(Ints.tryParse(input));
      }
    };
Run Code Online (Sandbox Code Playgroud)

当您使用Optional - > transform - >或在一行中时,使用不是那么笨拙(指定转换的可选整数会产生Optional<Optional<Integer>>).


Pau*_*ora 5

使用Optional.transformjust似乎与可能失败的转换不兼容 - 理论上这意味着可选的可选,当你想要做的是巩固缺席时.我建议使用以下内容:

Optional<String> strOptional = Optional.of("Toto");
Optional<Integer> intOptional =
        strOptional.isPresent()
        ? Optional.fromNullable(Ints.tryParse(strOptional.get()))
        : Optional.<Integer>absent();
Run Code Online (Sandbox Code Playgroud)