2017-04-06 49 views
0

我遇到了一個問題,其中我的類包含多個重複代碼的方法。其原因是每種方法都會遍歷一個條目列表並調用特定的條目方法。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不包含布爾返回類型。這就是爲什麼我用謂詞(謂詞,作爲邪教的對比,以消費者的原因,返回一個更適合我布爾值 - 而我忘了最初提及:((()

感謝您的幫助和時間

+0

類似'list.stream()的forEach()'? – Kayaman

+0

爲什麼它必須是lambda。爲什麼你不能傳入任何類型的函數指針? –

+2

爲什麼不呢?您是否嘗試過適當的功能界面類型?像'Comsumer '? –

回答

2

!你不應該混淆的方式,你通話的方法,這可能會或可能不會涉及拉姆達的方式,以及你的方法,其中包括尋找合適的參數類型。

當你寫一個方法,你需要關注你的參數的類型,如果其中一個是表示函數的對象,你需要的是und要知道這個函數應該匹配的適當的簽名,並且這會給你作爲參數類型的功能界面。

就你而言,你期望一個函數接受1個類型爲LowLevelClass的參數,並且不返回任何值。您可能會對此感到驚訝,但您需要將實例方法看作是將類的實例(this)作爲額外的第一個參數(而不是靜態方法)的函數。

因此,Consumer<LowLevelClass>界面是你想要什麼:

public void doSomething(Consumer<LowLevelClass> operation) { 
    System.out.println("Doing A"); 
    for (LowLevelClass entry : classes) { 
     System.out.println("Doing something..."); 
     operation.accept(entry); // or something else... 
     System.out.println("Done"); 
    } 
} 

public void doSomethingA() { 
    return doSomething(LowLevelClass::doSomethingA); 
} 
+0

這是正確的答案。另外,我忘記了返回值。這最終導致我被預測而不是消費者。無論如何,解釋都是重點。 – xanmcgregor

相關問題