0

以下の JavaScript の例を、ラムダを使用して Java 8 の対応するコードに変換する方法。Java 8ラムダを取得しようとしています。
構成例。

// js
var isFlag = true,
    name = (function () {
        if (isFlag) return "A";
        else return "B";
    })();
console.log(name);

//outputs: A

Java 8で書いてみましたが、構文か何かが間違っています。以下のコードを参照してください。

// LambdaTest.java
class LambdaTest {
    public LambdaTest() {
        boolean isFlag = true;
        String name = () -> { //I know this is wrong. It is not an IIFE. But how to write one?
            if (isFlag) return "A";
            else return "B";
        };
        System.out.println(name);
    }
    public static void main(String... args) {
        LambdaTest lt = new LambdaTest();
    }
}

// outputs:
// LambdaTest.java:4: error: incompatible types: String is not a functional interface
//        String name = () -> {
//                      ^
// 1 error

ありがとう。

4

3 に答える 3

3

ラムダを関数型インターフェイスのインスタンスに変換するには、「ターゲット タイプ」を指定する必要があります。その特定の型の変数を宣言したくない場合は、キャストがそのトリックを行います。次に、機能インターフェースのメソッドを呼び出します。この場合Supplier、引数を取らず、型 T を返す をお勧めします。 の抽象メソッドはSupplierisget()なので、それを呼び出します。

これを試して:

import java.util.function.Supplier;

class LambdaTest {
    public LambdaTest() {
        boolean isFlag = true;
        String name = ((Supplier<String>) () -> {
            if (isFlag) return "A";
            else return "B";
        }).get();
        System.out.println(name);
    }
    public static void main(String... args) {
        LambdaTest lt = new LambdaTest();
    }
}

(2013 年 1 月中旬以降の JDK8 アーリー アクセス ビルド 73 でテスト済み。)

于 2013-02-06T02:21:01.203 に答える
1

私はJavaプログラマーではありませんが、次のようなことがうまくいくようです:

import java.util.concurrent.Callable;
import java.lang.String;

class LambdaTest {
    public LambdaTest() {
        boolean isFlag = true;
        Callable<String> name = () -> {
            if (isFlag) return "A";
            else return "B";
        };  
        try {
            System.out.println(name.call());
        } catch (Exception e) {
            //cause call can throw exception so we need to handle that
        }   
    }   
    public static void main(String... args) {
        LambdaTest lt = new LambdaTest();
    }   
}
于 2013-02-04T10:46:33.770 に答える