Java 8中的模仿C#动作

时间:2016-11-05 10:27:27

标签: java c# action consumer

动作很好,因为你可以传递一个任意函数,返回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);
}

问题

  1. 消费者只期望一个参数,而Actions可以是任何返回void的东西。
  2. 由于我不能简单地在Java中调用block(),我需要传递一个冗余的null参数。
  3. 由于后一个原因,我必须让measure()本身返回一个Consumer。
  4. 问题: - 我可以通过使用方法而不是外部消费者来模仿这个,从而使null参数过时了吗?

1 个答案:

答案 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);
}