2017-09-05 16 views
0

Javaでラムダを使用して、作成時にオブジェクトのフィールドを構成したいと考えています。これはラムダインラインを呼び出さなければならないことを意味しますが、最初に何かにラムダを割り当てる前にラムダを実行する例は見ていません。具体的には次のようにしたいと思います:Javaラムダの結果をフィールドに代入

private JTextField tfInput =() -> { JTextField tf = JTextField(""); tf.setEditable(false); return tf; }(); 

これはJavaで可能ですか?

+1

ポイントは何ですか?ステートメントを直接実行してみませんか? – shmosel

+0

インラインで実行すると、他の関数の中で何もしないので、tf.getEditable()はfalse(デフォルトでは少なくとも)になります。とにかく、このコーディングスタイルが良いかどうかは後で決めることができます。私はそれが可能かどうかを知りたいだけです。 – PopKernel

+0

私はあなたが 'tfInput = new JTextField(" "); tfInput.setEditable(false); 'コンストラクタ内にあります。私はラムダが何のためになるかわかりません。 – ajb

答えて

3

あなたが最初の機能のインターフェイスにラムダをキャストする必要があります:

private JTextField tfInput = (Supplier<JTextField>)(() -> { 
    JTextField tf = new JTextField(""); 
    tf.setEditable(false); 
    return tf; 
}).get(); 

しかし、私はあなたが簡単な方法を宣言するか、コンストラクタから初期化するのではなく、このために選ぶだろう、なぜわかりませんかイニシャライザブロックまた、フィールドが初期化された後にのみ表示されるようにする場合は、finalまたはvolatileにする必要があります。

+1

これを行うメソッドを作成する方が効率的かもしれません。 – Killjoy1221

+0

@ Killjoy1221:...コンストラクタでこれを行うことができます。これはもっと簡単です: 'private JTextField tfInput; {tfInput =新しいJTextField( ""); tfInput.setEditable(false); } '。編集可能なテキストフィールドを表示する可能性がないというOPの目標は、ラムダバリアントと同じ制限で達成されます。 – Holger

関連する問題