动作很好,因为你可以传递一个任意函数,返回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);
}
问题:
null
参数。问题: - 我可以通过使用方法而不是外部消费者来模仿这个,从而使null参数过时了吗?
答案 0 :(得分:0)
对于非参数方法,您可以使用Runnable
代替Consumer
。
private static Runnable measure(Runnable block) {
return () -> {
long start = System.nanoTime();
block.run();
System.out.printf("Time elapsed: %d Milliseconds\n", (System.nanoTime() - start) / 1000);
};
}
然后:
public static void main(String[] args) {
measure(System.out::println("Hello")).run();
}
虽然现在我考虑过它,但你真的不需要归还Runnable
:
private static void measure(Runnable block) {
long start = System.nanoTime();
block.run();
System.out.printf("Time elapsed: %d Milliseconds\n", (System.nanoTime() - start) / 1000);
}