Действия хороши, потому что вы можете просто передать произвольную функцию, возвращающую 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);
}
Проблемы:
- Потребители ожидают только один аргумент, пока Действия могут быть любыми, что возвращает void.
- Поскольку я не могу просто вызвать block() в Java, мне нужно передать его избыточным параметром
null
. - По последней причине я должен сам сделать measure(), возвращая Потребителя.
Вопрос: - Могу ли я имитировать это, используя метод вместо внешнего потребителя, что делает нулевой параметр устарел?
Почему вы возвращаете работоспособным? Мне это не нужно, насколько мне известно. – Sweeper
Да, я тоже думал о том, что, если честно. (Я просто стараюсь быть верным вопросу OP). –
Установите упрощенную версию без возврата. Я думаю, это может быть то, что он хочет. – Fabricio