簡體   English   中英

如何使用功能接口組織Java 8代碼

[英]How to organize java 8 code with Functional interfaces

我最近開始閱讀有關Java 8功能的信息,但我對看起來很基本的東西感到困惑。 如何以“功能風格”組織代碼? 無論我做什么,它看起來都非常面向我。

最好用一個例子來解釋我的要求。

    @FunctionalInterface
    public interface SubstringOperator {

        String splitAtLastOccurence(String plainText, String delimiter);

    }

假設在某些class我總是只需要SubstringOperator接口的一種特定實現。 我可以在構造函數中提供實現,如下所示:

public class SomeClass {

    private SubstringOperator substringOperator;

    public SomeClass() {

        substringOperator = (s, d) -> { return s.substring(s.lastIndexOf(d)+1);};
    }
}

我現在可以在SomeClass內的任何方法中使用此實現,如下所示:

 //...
String valueAfterSplit = substringOperator.splitAtLastOccurence(plainText, "=");

如果我現在想添加另一個類,該類可重用該特定的SubstringOperator實現,我是否應該創建另一個類,通過getter公開實現?

我是否缺少明顯的東西,或者:

  • 函數必須包含在類中才能重用它們?
  • 與面向對象的范式有什么不同?

撇開Stream API和其他東西,我想對Java 8中的函數式編程的代碼組織有了基本的了解。

通常,最好重用現有的功能接口,而不要創建新的功能接口。 在您的情況下,您需要BinaryOperator<String> 最好用變量的含義而不是類型來命名變量。 因此,您可能具有:

public class SomeClass {
    private BinaryOperator<String> splitAtLastOccurence = 
        (s, d) -> s.substring(s.lastIndexOf(d)+1);
}

請注意,您可以簡化單語句lambda,刪除return關鍵字和大括號。 可以這樣應用:

String valueAfterSplit = splitAtLastOccurence.apply(plainText, "=");

通常,如果您的類始終使用相同的函數,則無需將其存儲在變量中。 改用普通的舊方法:

protected static String splitAtLastOccurence(String s, String d) {
    return s.substring(s.lastIndexOf(d)+1);
}

並稱之為:

String valueAfterSplit = splitAtLastOccurence(plainText, "=");

當通過函數對另一個類或方法進行參數化時,函數會很好,因此可以將其用於不同的函數。 例如,您正在編寫一些通用代碼,這些代碼可以處理帶有other字符串的字符串列表:

void processList(List<String> list, String other, BinaryOperator<String> op) {
    for(int i=0; i<list.size(); i++) {
        list.set(i, op.apply(list.get(i), other));
    }
}

或更多Java-8樣式:

void processList(List<String> list, String other, BinaryOperator<String> op) {
    list.replaceAll(s -> op.apply(s, other));
}

這樣,您可以將此方法用於不同的功能。 如果您已經具有splitAtLastOccurence靜態方法,則可以使用方法參考重用它:

processList(myList, "=", MyClass::splitAtLastOccurence);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM