首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,函数指针最接近的替代品是什么?

在Java中,函数指针最接近的替代品是什么?
EN

Stack Overflow用户
提问于 2008-09-23 17:20:11
回答 15查看 90.5K关注 0票数 305

我有一个大约有十行代码的方法。我想创建更多的方法来做完全相同的事情,除了要改变一行代码的小计算。这是一个完美的应用程序,可以传入一个函数指针来替换这一行,但是Java没有函数指针。我最好的选择是什么?

EN

回答 15

Stack Overflow用户

发布于 2008-09-23 17:27:07

对于每个“函数指针”,我会创建一个小的functor class来实现您的计算。定义一个所有类都将实现的接口,并将这些对象的实例传递给更大的函数。这是"command pattern“和"strategy pattern”的组合。

@sblundy的例子很好。

票数 32
EN

Stack Overflow用户

发布于 2009-03-27 00:16:32

当您可以在一行中执行预先定义数量的不同计算时,使用枚举是实现策略模式的一种快速而清晰的方法。

代码语言:javascript
复制
public enum Operation {
    PLUS {
        public double calc(double a, double b) {
            return a + b;
        }
    },
    TIMES {
        public double calc(double a, double b) {
            return a * b;
        }
    }
     ...

     public abstract double calc(double a, double b);
}

显然,策略方法声明以及每个实现的一个实例都是在单个类/文件中定义的。

票数 28
EN

Stack Overflow用户

发布于 2008-09-23 17:30:22

您需要创建一个接口来提供您想要传递的函数。例如:

代码语言:javascript
复制
/**
 * A simple interface to wrap up a function of one argument.
 * 
 * @author rcreswick
 *
 */
public interface Function1<S, T> {

   /**
    * Evaluates this function on it's arguments.
    * 
    * @param a The first argument.
    * @return The result.
    */
   public S eval(T a);

}

然后,当您需要传递一个函数时,您可以实现该接口:

代码语言:javascript
复制
List<Integer> result = CollectionUtilities.map(list,
        new Function1<Integer, Integer>() {
           @Override
           public Integer eval(Integer a) {
              return a * a;
           }
        });

最后,映射函数使用传入的Function1,如下所示:

代码语言:javascript
复制
   public static <K,R,S,T> Map<K, R> zipWith(Function2<R,S,T> fn, 
         Map<K, S> m1, Map<K, T> m2, Map<K, R> results){
      Set<K> keySet = new HashSet<K>();
      keySet.addAll(m1.keySet());
      keySet.addAll(m2.keySet());

      results.clear();

      for (K key : keySet) {
         results.put(key, fn.eval(m1.get(key), m2.get(key)));
      }
      return results;
   }

如果不需要传入参数,您通常可以使用Runnable而不是您自己的接口,或者您可以使用各种其他技术来减少参数计数的“固定”,但这通常是与类型安全的权衡。(或者,您可以覆盖函数对象的构造函数,以这种方式传入参数。有很多方法,其中一些在某些情况下工作得更好。)

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/122407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档