5

我有一种方法可以产生Optional<String>

但是这个 String 必须在另一个应用程序级别解析为 Integer 或 Long。

这我有一个Function<String, Integer>可以应用于字符串,以产生一个整数。此转换可能会失败,因为 String 可能不是 Integer 可解析值。


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

我不能让 STRING_TO_INTEGER_FUNCTION 返回 null,因为 Guava 不允许这样做:

Exception in thread "main" java.lang.NullPointerException: Transformation function cannot return null.

因此,我唯一能做的就是得到一个Function<String,Optional<Integer>>,但最终结果是一个Optional<Optional<Integer>>,这并不是很酷,因为我可能需要对其进行其他转换。


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

Optional.of("Toto").transform(STRING_TO_INTEGER_FUNCTION) = // Optional<Integer> ?

谢谢

4

3 回答 3

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));
      }
    };

当您使用 Optional -> transform -> 或在一行中(分配转换后的可选整数会产生)时,用法并不是那么笨拙。Optional<Optional<Integer>>

于 2012-10-25T15:09:02.443 回答
5

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

Optional<String> strOptional = Optional.of("Toto");
Optional<Integer> intOptional =
        strOptional.isPresent()
        ? Optional.fromNullable(Ints.tryParse(strOptional.get()))
        : Optional.<Integer>absent();
于 2012-10-26T00:33:15.123 回答
1

除上述以外的其他选择:

  • 使用普通的 if/else(Guava 团队建议不要过度使用此类结构,遵循这些建议通常是明智的 - 否则您将不会节省太多代码行并使可读性变差)
  • 使用肮脏的技巧:from(singleton("Toto")).transform(STRING_TO_INTEGER_FUNCTION).filter(notNull()).first().orNull()- 只是假设的想法,恕我直言,它的可读性也很差。至少它不包含泛型、?: 运算符或匿名类,但代价是更多的静态导入。
  • 等待 Java 8,其中 Optional.map 允许空转换结果

您可以为http://code.google.com/p/guava-libraries/issues/detail?id=1171投票。不幸的是,Guava 团队似乎对将这个问题转化为某种结果犹豫不决。

于 2014-02-14T07:27:32.513 回答