在 Java中创建function objects
(导出适用于其他对象的单个方法的无状态对象)的最佳实践是什么?
4 回答
Java 8 类库有一个新包 java.util.functions,其中包含几个新的函数接口。其中许多可以与 Collections API 一起使用。
如果您遵循此处展示的模式,您将拥有一个功能接口(一个支持一种方法的接口)和一个没有成员的实现。您的函数对象不应在方法参数上调用任何可能改变其状态(即表现出副作用)的方法。不幸的是,你不能强制执行——你必须依赖惯例。
Java 是一种面向对象的编程语言,所以使用策略设计模式。
Java8 应该有 lambdas 来简化函数式接口实现的创建。在 Java8 之前,您可以查看 guava 库提供的内容:Functional Explained
这是文档的摘录:
Guava 提供了两个基本的“函数式”接口: Function,它具有单一的方法 B apply(A input)。通常期望 Function 的实例是引用透明的——没有副作用——并且与 equals 一致,即 a.equals(b) 意味着 function.apply(a).equals(function.apply(b) )。谓词,具有单一方法 boolean apply(T input)。Predicate 的实例通常被认为是无副作用的并且与 equals 一致。
好的评论后,这是一个答案:没有简单/方便的方法来传递函数。
大多数时候,您将声明一个实现接口的内部类,例如Comparator
:
http: //docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
函数不能作为参数传递的事实产生了许多所谓的设计模式,在这些模式中,您传递声明具有这些函数的对象类/接口。
正如其他人所提到的,使用 Java 8 生活会变得更轻松一些。