一、基本语法
左侧:Lambda表达式参数列表
右侧:Lambda表达式所需执行的功能,即Lambda体
接口中只有一个抽象方法,称为函数式接口,在接口中可以使用注解@FunctionalInterface
- 无参数,无返回值()->System.out.println(“hah”)
@Test
public void test_1() {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("this is format");
System.out.println("this is format");
}
};
new Thread(r).start();
System.out.println("-----------------------------");
Runnable rr = () -> {
System.out.println("this is new format");
System.out.println("this is new format");
};
new Thread(rr).start();
}
2.有一个参数,无返回值(x)->System.out.println(x)
@Test
public void test_2() {
Consumer<String> con = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
con.accept("this is test");
System.out.println("-----------------------------");
Consumer<String> conn = (x) -> System.out.println(x);
conn.accept("lambda test");
}
3.有两个以上的参数,有返回值 (x,y)->{ return xx;}
@Test
public void test_3() {
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(com.compare(1, 3));
System.out.println("----------------------------");
Comparator<Integer> comm = (x, y) -> x.compareTo(y);
Comparator<Integer> commm = (x, y) -> {
System.out.println("");
return x.compareTo(y);
};
System.out.println(comm.compare(1, 3));
System.out.println(commm.compare(1, 3));
}
如果实现只有一句,则return可以省略
Collections.sort(list,(x,y)-> x.getAge()-y.getAge());
二、四大内置核心函数式接口
1.Consumer<T>:消费型接口
void accept(T t);
2.Supplier<T>:供给型接口
T get();
3.Functjion<T ,R>:函数型接口
R apply(T t);
4.Predicate<T>:断言型接口
boolean test(T t);
三、方法引用与构造器引用
方法引用:主要三种语法格式:
对象::实例方法名
类::静态方法名
类::实例方法名
使用条件:
1.lambda体中调用方法的参数列表与返回值类型,与函数式接口中的抽象方法的函数参数列表与返回值保持一致。
2.若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::mothod.
举例:
Bipredicate(String,String) bp = (x,y) -> x.equals(y);
Bipredicate(String,String) bp = (x,y) -> String::equals;
构造器引用:
Supplier<Person> su1 =() -> new Person();
Supplier<Person> su2 = Person::new;