0

Java エコシステムでおそらく最も使用されている 3 つの実装 (Java 8、Functional Java、および Guava) で、さまざまな Option/Optional セマンティクスの背後にある理由を理解しようとしています。

次の 3 つのスニペットを検討します。

  1. java.util.Optional.of(100).map(i -> null)になりますOptional.empty
  2. fj.data.Option.some(100).map(i -> null)になりますSome(null)
  3. com.google.common.base.Optional.of(100).transform(i -> null)結果NullPointerException

3つの選択の背後にある理由は何ですか? 該当する場合、関数型プログラミングの観点から最も「純粋」または「正しい」と考えられるものは何ですか? たとえば、Option型をモナドと見なすという点では、何が最も正しいでしょうか。または、最も構成可能と見なすことができるものは何ですか? null を許可する関数型言語でこれがどのように処理されるかを知ることも興味深いでしょう。

4

1 に答える 1

1

グアバの行動の本当の理由はわかりません。他の 2 つに関しては、作成者が null 値をどのように定義したかによって異なります。

  • Java 8nullは、値が存在しないことを定義した値であるため、Optional.empty
  • 機能的な Java はnull、値がない場合とは異なり、可能な値として定義されているように見えました。

    より具体的な理由として、map定義を見てみましょう。

    public final <B> Option<B> map(final F<A, B> f) {
       return isSome() ? some(f.f(some())) : Option.none();
    }
    

    「コンテナ」が でない限りNone、その変換された値は ではありませんNone。Java 8 と同様の結果を得るには、fromNull使用できます。

「純粋」か「正しい」かというと、おそらく昔と同じような答えは0が自然数?:)

于 2016-06-23T09:56:05.440 に答える