gpt4 book ai didi

java - 在 Java 8 中模仿 C# 操作

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:33 26 4
gpt4 key购买 nike

Action 很好,因为你可以传递一个返回 void 作为参数的任意函数。

用例?任何函数包装器,例如定时器。

所以基本上我可以在 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);
}

问题:

  1. 消费者期望只有一个参数,而 Actions 可以是任何返回 void 的东西。
  2. 由于我不能简单地在 Java 中调用 block(),我需要向它传递一个冗余的 null 参数。
  3. 出于后一个原因,我必须让 measure() 本身返回一个 Consumer。

问题:- 我可以通过使用一种方法而不是外部消费者来模仿这一点,从而使 null 参数过时吗?

最佳答案

对于无参数方法,您可以使用 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);
}

关于java - 在 Java 8 中模仿 C# 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com