を書いて、よりコンパクトな方法である:
private static interface A {
void apply(String name, int i, int j);
}
private final A method_A = this::methodOne;
private final A method_B = this::methodTwo;
public void methodOne(String name, int i, int j){
// do something
}
public void methodTwo(String name, int i, int j){
// do some other thing
}
二つの変数method_A
とmethod_B
のタイプがあるだけで、通常の変数ですA
。これに関する本当の特別なことは、変数に割り当てた値です - this::methodOne
。
私はあなたがクラスとインターフェイスについての知識と、そのインスタンスがどのように機能するかを前提としています。そうでない場合は、まずそれらのことを学びます。
A
にはメソッドが1つしかないため、メソッドを「格納」するタイプのように扱うことができます。私は理由を説明します。あなたが唯一のapply
メソッドを持つ匿名クラスを作成
private final A method_A = new A() {
@Override
public void apply(String name, int i, int j) {
EnclosingClass.this.methodOne(name, i, j);
}
};
:
のJava 8の前に、あなたはこのような何かを書くでしょう。見る? method_A
オブジェクトはメソッドの実装以外何も格納していませんか?あなたはおそらく、今では想像できるとおり、それはすべてのシンタックスシュガーです
private final A method_A = this::methodOne;
:
のJava 8ので、あなたの代わりにこのラムダ式を書くことができます。基本的にはmethod_A
にはmethdOne
が保存されます。その後、method_A
を渡すことができ、実際にはメソッドの実装を渡しています!
新しいストリームAPIはこれを利用し、することができますあなたは、のようなものです:
someList.stream().forEach(System.out::println);
ありがとうございます。ショートカットは面白いです! – theeminence
@eteminence質問に答えたと思う場合は、チェックマークをクリックして回答を受け入れることを検討してください。 – Sweeper
私はあなたの答えを受け入れました – theeminence