1. ホーム
  2. java

[解決済み] Java 8でモナドを使う

2023-07-10 22:43:43

質問

モナドとは何かということを理解するために、どなたかJavaを使った例を示していただけませんか?それらは可能ですか?

ラムダ式は、プレリリースされたラムダ互換のJDK8をここからダウンロードすれば、javaで可能です。 http://jdk8.java.net/lambda/

このJDKを使ったラムダの例を以下に示しますが、誰か比較的にシンプルなモナドを提供してくれませんか?

public interface TransformService {
        int[] transform(List<Integer> inputs);
    }
    public static void main(String ars[]) {
        TransformService transformService = (inputs) -> {
            int[] ints = new int[inputs.size()];
            int i = 0;
            for (Integer element : inputs) {
                ints[i] = element;
            }
            return ints;
        };

        List<Integer> inputs = new ArrayList<Integer>(5) {{
            add(10);
            add(10);
        }};
        int[] results = transformService.transform(inputs);
    }

どのように解決するのですか?

ご参考までに。

提案された JDK8 オプション クラス を満たします。 という3つの モナドの法則 . ここでは を実演している要点です。 を示します。

モナドに必要なのは になります。 に準拠した関数を提供することです。 3つの の法則に従うものである。

つの機能。

  1. を配置する。 の値をモナド文脈に置く

    • HaskellのMaybe。 return / Just
    • Scalaのオプションです。 Some
    • Functional Java のオプションです。 Option.some
    • JDK8 のオプション。 Optional.of
  2. を適用する 関数をモナド文脈で適用する

    • HaskellのMaybe。 >>= (別名 bind )
    • Scalaのオプションです。 flatMap
    • Functional Java のオプションです。 flatMap
    • JDK8 のオプション。 flatMap

をご覧ください。 上記の gist をご覧ください。

注:理解すべき重要なことのひとつは、署名の 関数がモナド文脈で適用されること : それは生の値型を取り、モナド型を返します。

言い換えれば、もしあなたが Optional<Integer> のインスタンスがある場合、そのインスタンスに渡すことのできる関数は flatMap メソッドに渡すことができる関数は、シグネチャが (Integer) -> Optional<U> ここで U は値の型であり、必ずしも Integer である必要はなく、例えば String :

Optional<Integer> maybeInteger = Optional.of(1);

// Function that takes Integer and returns Optional<Integer>
Optional<Integer> maybePlusOne = maybeInteger.flatMap(n -> Optional.of(n + 1));

// Function that takes Integer and returns Optional<String>
Optional<String> maybeString = maybePlusOne.flatMap(n -> Optional.of(n.toString));

この方法でコーディングしたり、この方法で考えたりするために、モナド・インターフェースのようなものは必要ないのです。Scalaでは、(Scalazライブラリを使っていない限り)Monad Interfaceに対してコードを書くことはありません。JDK8 では、Java の人たちがこのスタイルの 連鎖したモナド計算 も使えるようになるようです。

お役に立てれば幸いです。

更新しました。 この件に関するブログ ここで .