[英]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.