【问题标题】:Passing different methods as arguments in Java 8在 Java 8 中将不同的方法作为参数传递
【发布时间】:2016-06-21 13:43:05
【问题描述】:

我一直在研究 lambda 表达式以及如何在 java 8 中将方法作为参数传递,但我不确定在我的情况下是否可行:

我有多个具有相似方法的类,但在某些类中方法名称不同。每个方法都采用 Long 作为参数来表示 ID。 所以,我正在努力:

void setScore(List<Long> nodes, method){
    for (Long id : nodes)
        System.out.println( method(id) );
    }
}

这是我想通过的两个方法示例,但我有:

Double DegreeScorer<Long>.getVertexScore(Long id)
Double BetweennessCentrality<Long, Long>.getVertexRankScore(Long id)

我以为我找到了使用 LongConsumer 接口的解决方案,但是 LongConsumer 没有返回任何值,所以我无法存储结果。

任何帮助将不胜感激。

更新: 我最终得到:

<T> void setScore(List<Long> nodes, LongFunction<T> getScore){
    for (Long id : nodes)
        System.out.println(getScore.apply(id));
    }
}

setScore(nodes, ranker::setVertexScore);

【问题讨论】:

  • LongToDoubleFunction 呢?
  • LongFunction 怎么样? R 是返回类型。
  • 如何将函数作为参数传递?我的类存储算法的结果,所以我想先调用 ranker.evaluate() 然后传递 ranker.getVertexScore(Long id)。调用 setScore 时使用什么语法? setScore(nodes, ranker.getVertexScore) 给我一个错误
  • 您可以(可能)使用setScore(nodes, l -&gt; ranker.getVertexScore(l))setScore(nodes, ranker::getVertexScore) 调用它。请阅读 lambda 教程docs.oracle.com/javase/tutorial/java/javaOO/… 了解更多信息

标签: java function lambda java-8 arguments


【解决方案1】:

如果您的所有方法都返回 Double,请使用 java.util.Function&lt;Long,Double&gt;

void setScore(List<Long> nodes, Function<Long,Double> fn) {
    for (Long id : nodes)
         System.out.println(fn.apply(id));
    }
}

如果您有不同的返回类型,请添加泛型类型参数

<T> void setScore(List<Long> nodes, Function<Long,T> fn) {
    for (Long id : nodes)
         System.out.println(fn.apply(id));
    }
}

【讨论】:

  • 类型参数&lt;T&gt; 已过时。该方法可以接受Function&lt;Long,?&gt;,而不会对结果产生任何影响。
  • @Holger 你是对的,这个例子不依赖它。但一般情况下,您可能需要一个类型参数而不仅仅是?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2018-04-13
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多