2016-11-05 2 views
2

Действия хороши, потому что вы можете просто передать произвольную функцию, возвращающую void в качестве параметра.Mimic C# Действия в Java 8

Используемые случаи? Любые функциональные оболочки, например, Таймеры.

Так Bascially в 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. Потребители ожидают только один аргумент, пока Действия могут быть любыми, что возвращает void.
  2. Поскольку я не могу просто вызвать block() в Java, мне нужно передать его избыточным параметром null.
  3. По последней причине я должен сам сделать measure(), возвращая Потребителя.

Вопрос: - Могу ли я имитировать это, используя метод вместо внешнего потребителя, что делает нулевой параметр устарел?

ответ

0

Для метода no-args вы можете использовать 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); 
} 
+0

Почему вы возвращаете работоспособным? Мне это не нужно, насколько мне известно. – Sweeper

+0

Да, я тоже думал о том, что, если честно. (Я просто стараюсь быть верным вопросу OP). –

+0

Установите упрощенную версию без возврата. Я думаю, это может быть то, что он хочет. – Fabricio

Смежные вопросы