Будут ли методы в лямбде оцениваться только при выполнении лямбды? - PullRequest
3 голосов
/ 23 января 2020

Можем ли мы быть уверены, что методы, вызываемые в java лямбде, только , вызываемые при выполнении самой лямбды, и никогда заранее?

Если вы посмотрите на мой код:

StringBuilder myStringBuilder = new StringBuilder("my result");
Supplier<String> mySupplier = () -> "result: " + myStringBuilder.toString();
myStringBuilder.append(", after appending.");
System.out.println(mySupplied.get());

Можем ли мы быть на 100% уверены, что результат всегда будет:

результат: мой результат после добавления

И никогда просто

Результат: мой результат

Ответы [ 5 ]

4 голосов
/ 23 января 2020

Рассмотрим следующий snappet:

Runnable runnable = () -> expensiveMethod();  // Runnable not called
firstMethodCall();                            // Runnable not called
secondMethodCall();                           // Runnable not called
runnable.run();                               // HERE IT COMES, Runnable IS called

Лямбда-выражение - не что иное, как реализация анонимного класса с одним методом (это обеспечивает аннотацию @FunctionalInterface).

Runnable runnable = new Runnable() {
     void run() {
         expensiveMethod();
     }
};

// runnable's method is not executed since the method run is not called
// the runnable.run() invokes the expensiveMethod()

Спецификация Java 8 15,27. Лямбда-выражения объясняет, что выражение вызывается при вызове соответствующего метода функционального интерфейса :

Оценка лямбда-выражения приводит к созданию экземпляра функционального интерфейса ( §9.8). Оценка лямбда-выражения не вызывает выполнение тела выражения; вместо этого это может произойти позже, когда будет вызван соответствующий метод функционального интерфейса.

1 голос
/ 23 января 2020

Да. Лямбда-код выполняется только при вызове, а не при выполнении содержащей строки.

0 голосов
/ 23 января 2020

Lamba является реализацией функционального интерфейса . Его содержимое будет изменено / вычислено во время его вызова.

Так что, да, вы можете на 100% быть уверены в своем предположении:)

0 голосов
/ 23 января 2020

Согласно spe c

Оценка лямбда-выражения не приводит к выполнению тела выражения; вместо этого это может произойти позже, когда будет вызван соответствующий метод функционального интерфейса.

0 голосов
/ 23 января 2020

Лямбда похожа на код реализации интерфейса и точно так же, как реализация интерфейса, она будет выполняться только при вызове.

...