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