把一段代码赋值给一个变量. 比如 code = public void doSomething(String s){sout;} 其中 public 和 方法名都是多余的,对于void来说编译器可以自行判断返回值类型,同样的对于参数s也可以自行判断 对于花括号里面的内容来说,如果只有一行代码可以用 ->代替{}
code = (s)->sout(s); 对于 这块代码 就是lambda表达式 ,而对于code而言就可以理解为lambda类型的变量,在Java8中所有lambda类型都是一个接口,而lambda表达式就是接口的实现 而这个接口只有一个接口函数,称为函数式接口
比如自定义接口:
@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>
@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);
}
});
}