我遇到了一個問題,其中我的類包含多個重複代碼的方法。其原因是每種方法都會遍歷一個條目列表並調用特定的條目方法。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完成嗎?換句話說,我可以定義在給定列表的每個條目上執行的方法嗎?
編輯1個
通過喬恩Vernee和喬佛裏提供的答案是正確的!
最終,解決方案是使用Predicate。 (見編輯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不包含布爾返回類型。這就是爲什麼我用謂詞(謂詞,作爲邪教的對比,以消費者的原因,返回一個更適合我布爾值 - 而我忘了最初提及:((()
感謝您的幫助和時間
類似'list.stream()的forEach()'? – Kayaman
爲什麼它必須是lambda。爲什麼你不能傳入任何類型的函數指針? –
爲什麼不呢?您是否嘗試過適當的功能界面類型?像'Comsumer'? –