定义
把一段代码赋值给一个变量. 比如 code = public void doSomething(String s){sout;}
其中 public 和 方法名都是多余的,对于void来说编译器可以自行判断返回值类型,同样的对于参数s也可以自行判断 对于花括号里面的内容来说,如果只有一行代码可以用 ->代替{}
code = (s)->sout(s);
对于 这块代码 就是lambda表达式 ,而对于code而言就可以理解为lambda类型的变量, 在Java8中所有lambda类型都是一个接口,而lambda表达式就是接口的实现 而这个接口只有一个接口函数,称为函数式接口
比如自定义接口:
java
@FunctionalInterface//标识只能有一个接口方法
public interface MyFunctionInterface {
void doSomething(String s);
}
@Test
public void lambda() {
MyFunctionInterface myFunctionInterface = s -> {
System.out.println("123" + s);
};
myFunctionInterface.doSomething("4");//1234
}
//可以看到利用lambda表达式简化了接口的实现所需要的代码(不需要新增类来实现接口中的方法)
- 成员函数和lambda表达式
//String::length 把String转为其长度 可以更换为e->e.length()
// e->System.out.println(e) == System.out::println
- 常用的几个jdk内置@FunctionalInterface接口
public interface Consumer
public interface Predicate
public interface BiConsumer<T, U>
public interface Function<T, R>
demo
java
@Test
public void lambda() {
Consumer<String> consumer = s -> {//不带返回值 void
System.out.println(s);
System.out.println(111);
};
consumer.accept("s");
Predicate<String> predicate = s -> {//带返回值 boolean
System.out.println(111);
System.out.println(s);
return false;
};
boolean a = predicate.test("a");
BiConsumer<String, Integer> biConsumer = (k, v) -> {//无返回值 两个入参
System.out.println(k + "" + v);
};
biConsumer.accept("num", 1);
//将P开头的Person打印出来
List<Person> personList = Arrays.asList(new Person("Paul"), new Person("Job"));
test1(person -> System.out.println(person.getName()), person -> person.getName().startsWith("P"), personList);
personList.stream().filter(person -> person.getName().startsWith("P")).forEach(person -> System.out.println(person.getName()));
}
public static void test1(Consumer<Person> consumer, Predicate<Person> predicate, List<Person> list) {
list.forEach(person -> {
if (predicate.test(person)) {
consumer.accept(person);
}
});
}