【问题标题】:Mimic C# Actions in Java 8在 Java 8 中模仿 C# 动作
【发布时间】: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);
}

问题

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

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

【问题讨论】:

    标签: java c# action consumer


    【解决方案1】:

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

    【讨论】:

    • 为什么要返回一个runnable?就我而言,它不需要。
    • 是的,老实说,我也是这么想的。 (我只是想忠实于 OP 的问题。)
    • 放个简化版不回。我想这可能是他想要的。
    • 看起来不错,但是有什么方法可以像 C# 中那样使用可变参数函数吗?
    • 问题是,在 C# 中,Action 委托是无参数委托。您需要添加类型参数才能使用参数。因此,例如,无参数 Action 与单参数 Action&lt;int&gt; 不同,这意味着您必须为每个参数数量编写不同的参数。类似地,在 Java 中,您需要使用适当的函数接口来满足您需要的 args 数量(Runnable 为 0,Consumer 为 1,BiConsumer 为 2,自定义的不止于此)。
    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2014-03-09
    相关资源
    最近更新 更多