
Лямбда-выражения работают только с функциональными интерфейсами - интерфейсами, содержащими только один абстрактный метод.
package lambda;
@FunctionalInterface
interface Validate {
boolean test(String s);
}
class A {
private static String str = "Some string";
public static void main(String[] args) {
Validate valid = s -> s.length() > 3;
System.out.println(valid.test(str)); // true
}
}
Тип параметра лямбда-выражения является опциональным: компилятор определяет его на основе типа параметра, принимаемого абстрактным методом интерфейса.
Чтобы явно указать тип параметра, его нужно заключить в скобки:
(SomeType obj) -> obj.doSomeChecking();
Тип возвращаемого значения должен соответствовать или быть приводимым к типу, возвращаемому лямбда-выражением.
Следующий код не скомпилируется:
Validate valid = s -> 10; // невозможно привести int к boolean
Если в теле лямбда-выражения необходимо выполнить несколько инструкций, или явно использовать ключевое слово return, то тело его нужно зключить в фигурные скобки.
Validate valid1 = s -> {int i = s.indexOf("a"); return i > 0;};
System.out.println(valid1.test(str)); // false
Validate valid2 = s -> {return s.contains("st");};
System.out.println(valid2.test(str)); // true