我有一个抽象迭代器类,它有这个函数
void iterate(){ while(this.hasnext()){ ..this.next().. } }
如何传入将应用于下一个元素的任意函数。比如,有没有办法 iterate(print) ?
iterate(print)
tuwxkamq1#
在java中,不可能直接将函数作为参数传入。相反,您需要使用如下方法设置一个接口:
interface Operate { public void operate(Object o); }
然后,您需要为要在上执行的每个不同操作实现接口 Object .示例实现。
Object
class Print implements Operate { public void operate(Object o){ System.out.println(o.toString()); } }
代码中的实现:
iterate(Operate o){ while(this.hasnext()){ o.operate(this.next()); } }
j8ag8udp2#
你认为打印是一种功能吗?java没有函数指针、实闭包或任何让您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法,
void apply(Object arg)
然后可以创建实现函数的不同类,并将这些类传递到迭代方法中。在您的示例中,您可能会这样做:
public class PrintFunction implements Function { void apply(Object arg) { System.out.println(arg.toString()); } }
brvekthn3#
我会重新考虑命名以澄清语义:在迭代器中有一个方法:
public <T> Object[] apply (Action<T> action, Object context) { List<T> results = new ArrayList<T>(); while(hasNext()) { results.add(action.invoke(this.next(), context)); } T[] r = new T[results.size()]; return results.toArray(r); } public interface Action <T> { public T invoke (Object target, Object context); }
context可以为null,但在某些情况下,您确实需要某种伪闭包来执行需要context的操作。为了使其更加健壮,可以考虑添加异常处理。
3条答案
按热度按时间tuwxkamq1#
在java中,不可能直接将函数作为参数传入。相反,您需要使用如下方法设置一个接口:
然后,您需要为要在上执行的每个不同操作实现接口
Object
.示例实现。
代码中的实现:
j8ag8udp2#
你认为打印是一种功能吗?java没有函数指针、实闭包或任何让您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法,
然后可以创建实现函数的不同类,并将这些类传递到迭代方法中。在您的示例中,您可能会这样做:
brvekthn3#
我会重新考虑命名以澄清语义:
在迭代器中有一个方法:
context可以为null,但在某些情况下,您确实需要某种伪闭包来执行需要context的操作。为了使其更加健壮,可以考虑添加异常处理。