5

私はOptional<String>

ただし、この文字列は、別のアプリケーションレベルで整数または長整数として解析する必要があります。

これはFunction<String, Integer>、整数を生成するために文字列に適用できるを持っています。文字列は整数の解析可能な値ではない可能性があるため、この変換は失敗する可能性があります。


解析例外をスローする代わりに、変換が失敗したときにオプションを返したいです。

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 -> または 1 行で使用する場合 (変換されたオプションの整数を割り当てると が生成されます)、使用法はそれほど不器用はありませんOptional<Optional<Integer>>

于 2012-10-25T15:09:02.443 に答える
5

を使用Optional.transformすることは、失敗する可能性のある変換と互換性がないようです-理論的には、これは、不在を統合することである場合、オプションのオプションを意味します。次のようなものを使用することをお勧めします。

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 に答える