2015-09-12 4 views
3

Рассмотрим код (не компилируемый):Поддерживает ли java 8 локальные переменные лямбда?

List<String> list = Arrays.asList("a", "b"); 
list.stream().map(s -> 
     String variable = method(s) 
     variable + "debug" 
); 

private String method(String s) { 
     return s; 
} 

Line String variable = method(s) не компилируется.

Могу ли я определить локальную переменную внутри лямбда-выражение или запрещено по дизайну?

+0

судя по 'debug', вы не хотите' peek() '? – epoch

+1

Взгляните на раздел [JLS 15.27.2] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.2), определяющий лямбда-тела. – Tunaki

+0

Какая ошибка вы получаете? Почему вы думаете, что у вас нет локальных переменных? –

ответ

12

Да, однако, для многозадачности lambdas необходимо обернуть блок кода в фигурные скобки. Вы также должны правильно использовать точки с запятой в концах операторов. Также вам нужно использовать ключевое слово return.

list.stream().map(s ->{ 
      String variable = method(s); 
      return variable + "debug"; 
     } 
    ); 

Одиночные лямбды заявление имеет подразумеваемое return, чтобы спасти вас от ввода и делает лямбда более удобным для чтения.

+0

@Holger хорошая вещь. Изменен текст в многопозиционном выражении – dkatzel

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