2016-06-30 3 views
4

В javascript есть общий шаблон создания анонимной функции и немедленного вызова (обычно это называется self-executing anonymous function или immediately-invoked function expression).Выполнение анонимных функций через Lambdas

С помощью Java 8 lambdas существует стандартный способ репликации этого поведения? Что-то вроде (() -> doSomething())().

This question задает в основном тот же вопрос, но для Java 7. Я явно ищу конструкции, которые используют лямбды.

+0

в java7, был анонимные классы – emotionlessbananas

+2

[Проверьте этот ответ] (http://stackoverflow.com/a/24290939/5050667) –

+0

@asteriskNinja лямбда * это * анонимный класс, только с более коротким синтаксисом. – OrangeDog

ответ

9

Не забудьте также указать тип. Поскольку Java является статически типизированным языком, а функции не являются гражданами первого сорта, компилятор должен знать, что такое лямбда, это тип. Функция не может быть просто свободной, она всегда должна быть связана либо с классом, либо с экземпляром класса.

Runnable r =() -> { 
    System.out.println("Hello world!"); 
}; 
r.run(); 

Но: Вы можете привести лямбда к Runnable типа, и дать компилятору намек на то, какой @FunctionalInterface вы реализуете:

((Runnable)() -> { 
    System.out.println("Hello world!"); 
}).run(); 

Или без скобок, что делает его однострочным:

((Runnable)() -> System.out.println("Hello world!")).run(); 

Я предполагаю, что это будет как можно ближе!

+0

Использует ли Runnable неотъемлемо новый поток (Runnable javadoc, похоже, довольно сосредоточен на потоках), или это просто выполнит код в текущем потоке? –

+2

@Aljoscha Meyer: «Runnable» - это просто интерфейс, как и любой другой. – Holger

+0

@AljoschaMeyer текущая резьба. – OrangeDog

1

А что-то вроде

((Runnable)(() -> System.out.println("Foobar"))).run(); 
Смежные вопросы