私のクラスには重複したコードがたくさんあるいくつかのメソッドが含まれているという問題が発生しました。この背後にある理由は、各メソッドがエントリのリストを横断し、特定のエントリメソッドを呼び出すためです。コードでJava Lambdas:パラメータとしてのメソッド名の送信
...
LowLevelClassクラスには、次の構造を有する:
public class LowLevelClass {
// constructor omitted
public boolean doSomethingA() {
// some non-duplicated code
return true;
}
public boolean doSomethingB() {
// some non-duplicated code
return true;
}
public boolean doSomethingC() {
// some non-duplicated code
return true;
}
}
トップレベルのクラスはLowLevelClassesのリストが含まれているとメソッドの同じ数が、この時間を持っている、と重複がたくさん:
:public class HighLevelClass {
private List<LowLevelClass> classes = new ArrayList<>();
public HighLevelClass() {
this.classes.add(new LowLevelClass(/* params */));
this.classes.add(new LowLevelClass(/* params */));
this.classes.add(new LowLevelClass(/* params */));
}
public void doA() {
System.out.println("Doing ...");
for (LowLevelClass entry : classes) {
System.out.println("Doing something...");
entry.doSomethingA();
System.out.println("Done");
}
}
public void doB() {
System.out.println("Doing ...");
for (LowLevelClass entry : classes) {
System.out.println("Doing something...");
entry.doSomethingB();
System.out.println("Done");
}
}
public void doC() {
System.out.println("Doing ...");
for (LowLevelClass entry : classes) {
System.out.println("Doing something...");
entry.doSomethingC();
System.out.println("Done");
}
}
}
私の目標は、の形で何かを持っていることです
public class HighLevelClass {
private List<LowLevelClass> classes = new ArrayList<>();
public HighLevelClass() {
this.classes.add(new LowLevelClass());
this.classes.add(new LowLevelClass());
this.classes.add(new LowLevelClass());
}
public void doSomething(Lambda /* Functional interface*/ operation) {
System.out.println("Doing A");
for (LowLevelClass entry : classes) {
System.out.println("Doing something...");
entry.operation; // or something else...
System.out.println("Done");
}
}
public void doSomethingA() {
// my goal... and maybe in totally wrong direction is to send something in form of...
return doSomething(LowLevelClass::doSomethingA);
}
// etc
}
これはJava 8 Lambdasで実行できますか?つまり、指定したリストの各エントリに対して実行するメソッドを定義できますか? ジョーンVerneeとジョフリーによって提供さ
EDIT 1つの
答えは正しいです!
最終的には、解決策はプレディケートを使用することでした。
EDIT 2
私の最初の方法で
パブリッククラスHighLevelClass {
private List<LowLevelClass> classes = new ArrayList<>();
public HighLevelClass() {
this.classes.add(new LowLevelClass());
this.classes.add(new LowLevelClass());
this.classes.add(new LowLevelClass());
}
public boolean doSomething(Predicate<LowLevelClass> function) {
System.out.println("Doing A");
for (LowLevelClass entry : classes) {
System.out.println("Doing something...");
boolean val = function.test(entry);
System.out.println("Done " + val);
}
return someEndVerdict;
}
public boolean doSomethingA() {
return doSomething(LowLevelClass::doSomethingA);
}
// etc
を}(私は最終的に消費者を使用しなかった理由... EDIT 2を参照してください) HighLevelClassにbooleanの戻り値の型が含まれていませんでした。それは、私は消費者にcontastとして述語(述語を使用した理由だ私をもっとよく合っブール値を返します - そしてその私が最初に言及するのを忘れてしまった:ヘルプと時間のための((()
おかげ
(list.stream 'など)のforEach()'。? – Kayaman
なぜラムダでなければならないのですか?どのような関数ポインタを渡すことができないのですか? –
なぜですか?あなたは適切な機能的なインターフェイスタイプを試しましたか? 'Comsumer'のように? –