Java 如何迭代并对每个项执行任意操作?
我有一个抽象迭代器类,它有这个函数Java 如何迭代并对每个项执行任意操作?,java,polymorphism,Java,Polymorphism,我有一个抽象迭代器类,它有这个函数 void iterate(){ while(this.hasnext()){ ..this.next().. } } 如何传入将应用于下一个元素的任意函数。例如,是否有方法进行迭代(打印)?在Java中,不可能直接将函数作为参数传入。相反,您需要使用以下方法设置一个接口: interface Operate { public void operate(Object o); } 然后,您需要为要在对象上执行的每个不同操
void iterate(){
while(this.hasnext()){
..this.next()..
}
}
如何传入将应用于下一个元素的任意函数。例如,是否有方法进行迭代(打印)?在Java中,不可能直接将函数作为参数传入。相反,您需要使用以下方法设置一个接口:
interface Operate {
public void operate(Object o);
}
然后,您需要为要在对象上执行的每个不同操作实现接口
一个示例实现
class Print implements Operate {
public void operate(Object o){
System.out.println(o.toString());
}
}
代码中的实现:
iterate(Operate o){
while(this.hasnext()){
o.operate(this.next());
}
}
在Java中,不可能直接将函数作为参数传入。相反,您需要使用以下方法设置一个接口:
interface Operate {
public void operate(Object o);
}
然后,您需要为要在对象上执行的每个不同操作实现接口
一个示例实现
class Print implements Operate {
public void operate(Object o){
System.out.println(o.toString());
}
}
代码中的实现:
iterate(Operate o){
while(this.hasnext()){
o.operate(this.next());
}
}
你认为打印是一种功能吗?Java没有函数指针、实闭包或任何允许您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法
void apply(Object arg)
然后可以创建实现该函数的不同类,并将它们传递到迭代方法中。在您的示例中,您可能会这样做:
public class PrintFunction implements Function {
void apply(Object arg) {
System.out.println(arg.toString());
}
}
你认为打印是一种功能吗?Java没有函数指针、实闭包或任何允许您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法
void apply(Object arg)
然后可以创建实现该函数的不同类,并将它们传递到迭代方法中。在您的示例中,您可能会这样做:
public class PrintFunction implements Function {
void apply(Object arg) {
System.out.println(arg.toString());
}
}
我将重新考虑命名以澄清语义:
在迭代器中具有方法:
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);
}
公共对象[]应用(操作、对象上下文){
列表结果=新建ArrayList();
while(hasNext()){
add(action.invoke(this.next(),context));
}
T[]r=新的T[results.size()];
返回结果。toArray(r);
}
公共接口操作{
公共T调用(对象目标、对象上下文);
}
上下文可以为null,但在某些情况下,您确实需要某种伪闭包来执行需要上下文的操作。为了使它更健壮,可以考虑添加异常处理。 < P>我会重新考虑命名来澄清语义:
在迭代器中具有方法:
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);
}
公共对象[]应用(操作、对象上下文){
列表结果=新建ArrayList();
while(hasNext()){
add(action.invoke(this.next(),context));
}
T[]r=新的T[results.size()];
返回结果。toArray(r);
}
公共接口操作{
公共T调用(对象目标、对象上下文);
}
上下文可以为null,但在某些情况下,您确实需要某种伪闭包来执行需要上下文的操作。为了使这个更加健壮,你可以考虑添加异常处理。基本上这是目前唯一的可能性,即使在java 7中也没有关闭。(这是正确的,我想指出的是,这被称为命令模式,一种非常有用的模式,在您使用过几次之后,您会本能地开始使用它。基本上,这是目前唯一的可能性,即使在Java 7中也没有闭包。删除它们的决定是一个令人悲伤的决定:(这是正确的,我想指出的是,这被称为命令模式,一种非常有用的模式,在你使用过几次之后,你会本能地开始使用它。