2

個別のスタンドアロン静​​的イニシャラー関数の必要性をラムダに置き換えたいと考えています。たとえば、このようなものを置き換えたい...

class Foo {
    private static final Set<String> keywords = keywords();

    private static Set<String> keywords() {
        HashSet<String> s = new HashSet<>();
        s.add("AND");
        s.add("NOT");
        s.add("OR");
        return Collections.unmodifiableSet(s);
    }
}

クラスのロード時に定義されたラムダを呼び出すものを使用します。これを怠惰に呼び出すことが私の目標ではないことに注意してください。

とりあえず、 を受け取り、それを呼び出して値を返すInitializer静的メソッドを持つ単純なクラスを作成しました。Supplier

Initializerクラス

public class Initializer {
    public static <T> T init(Supplier<T> initializer) {
        return initializer.get();
    }    
}

次に、別のクラスで:

import static com.whatever.Initializer.init;

class Foo {
    private static final Set<String> keywords = init(() -> {
        HashSet<String> s = new HashSet<>();
        s.add("AND");
        s.add("NOT");
        s.add("OR");
        return Collections.unmodifiableSet(s);
    });
}

独自のクラスを提供する必要がないように、標準 Java ライブラリに既に存在するものはありますInitializerか、それともラムダをインプレースで単純に定義して実行する方法はありますか?

4

3 に答える 3

2

ラムダをキャストして呼び出すことができます:

private static final Set<String> KEYWORDS = ((Supplier<Set<String>>) () -> {
    Set<String> result = new HashSet<>();
    ...
    return Collections.unmodifiableSet(result);
}).get();

または、既存のショートカットを使用できます。

private static final Set<String> KEYWORDS = 
    Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AND", "NOT", "OR")));

しかし、メソッドを呼び出す元のコードは非常に読みやすいです。私はそれを変更しません。

于 2015-10-31T14:46:36.523 に答える
1

@zeroflagL で述べたように、この場所でラムダを使用する必要はありません。keywords次を使用して、1行で初期化できます。

Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("AND", "NOT", "OR")));

しかし、これはあまりきれいではありません。staticそうでなければ、ブロックを使用して何が悪いのでしょうか? そのようなもののために作成されました。

でも使いたくないのであれば、標準的な方法はないと思います。イニシャライザを使用する必要があります。

于 2015-10-31T14:46:46.177 に答える