【发布时间】:2016-11-05 10:27:26
【问题描述】:
动作很好,因为你可以传递一个返回 void 作为参数的任意函数。
用例?任何函数包装器,例如 Timers。
所以基本上我可以在 C# 中编写一个方法
private static void Measure(Action block) {
var watch = new Stopwatch();
watch.Start();
block();
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
}
并像使用它
public static void Main(string[] args) {
Measure(() => {Console.WriteLine("Hello");});
}
测量该方法经过的时间。漂亮整齐。现在,如果我想在 Java 中模仿这一点,我需要编写一个方法
private static <T> Consumer<T> measure(Consumer<T> block) {
return t -> {
long start = System.nanoTime();
block.accept(t);
System.out.printf("Time elapsed: %d Milliseconds\n", (System.nanoTime() - start) / 1000);
};
}
并像使用它
public static void main(String[] args) {
measure(Void -> System.out.println("Hello")).accept(null);
}
问题:
- 消费者只需要一个参数,而 Actions 可以是任何返回 void 的东西。
- 由于不能简单地在 Java 中调用 block(),我需要传递一个多余的
null参数。 - 出于后一个原因,我必须让 measure() 本身返回一个消费者。
问题: - 我可以通过使用方法而不是外部消费者来模仿这一点,从而使 null 参数过时吗?
【问题讨论】: