我想在创建时使用Java中的lambda来配置对象的字段。这意味着我必须调用lambda内联,但是我没有看到任何运行lambda的示例,然后再将它分配给某些内容。具体而言,我想要做这样的事情:将Java lambda的结果分配给字段
private JTextField tfInput =() -> { JTextField tf = JTextField(""); tf.setEditable(false); return tf; }();
这在Java中可能吗?
我想在创建时使用Java中的lambda来配置对象的字段。这意味着我必须调用lambda内联,但是我没有看到任何运行lambda的示例,然后再将它分配给某些内容。具体而言,我想要做这样的事情:将Java lambda的结果分配给字段
private JTextField tfInput =() -> { JTextField tf = JTextField(""); tf.setEditable(false); return tf; }();
这在Java中可能吗?
你将不得不在lambda转换为功能接口第一:
private JTextField tfInput = (Supplier<JTextField>)(() -> {
JTextField tf = new JTextField("");
tf.setEditable(false);
return tf;
}).get();
但我不知道为什么你会为这个选择声明一个简单的方法,或者从构造函数初始化,而不是或一个初始化块。此外,请注意,如果您尝试确保该字段在初始化后才可见,则可能需要将其设为final
或volatile
。
创建一个这样做的方法可能更有效率。 – Killjoy1221
@ Killjoy1221:...或让构造函数执行此操作,这更简单:'private JTextField tfInput; {tfInput = new JTextField(“”); tfInput.setEditable(假); }'。 OP的目标是不可能看到可编辑的文本字段,这与lambda变体的限制相同。 – Holger
有什么意义?为什么不直接运行语句? – shmosel
因为它内联使得它在任何时候都不会在其他函数中将tf.getEditable()假(至少默认)。无论如何,稍后我可以决定这种编码风格是否好。我只想知道这是否可能。 – PopKernel
我想你可以把'tfInput = new JTextField(“”); tfInput.setEditable(false);'在构造函数中。我没有看到lambda会是什么。 – ajb