Lambda表达式
举例 (o1, o2) -> Integer.compare(o1, o2);
格式:
- -> lambda操作符h
- 左 lambda形参列表
- 右 lambda体
本质 作为接口的实例
如果一个接口中只声明了一个抽象方法,则此接口就称为函数式接口
用匿名实现类表示的方法现在都可以用Lambda表达式来写
使用
无参 无返回值
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("hello");}};r1.run();//使用后Runnable r2 = () -> System.out.println("hello");r2.run();
需要一个参数,但不需要返回值
@Testpublic void ooo(){Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};con.accept("hello,world!");//使用后Consumer<String> con2 = (String s) -> {System.out.println(s);};con2.accept("hello,world!");}}
类型推断
@Testpublic void oo(){Consumer<String> con2 = (s) -> {System.out.println(s);};con2.accept("hello,world!");}
Lambda只需要一个参数时 参数的小括号可以省略
public void oo(){Consumer<String> con2 = s -> {System.out.println(s);};con2.accept("hello,world!");}
Lambda需要两个或以上的参数,多条执行语句,。并且可以有返回值
@Testpublic void oooo(){Comparator<Integer> con3 =(o1, o2) -> {System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);};}
Java内置四大核心函数式接口
Consumer
消费型接口 - void accept(T t)
Consumer<String> con = (String s) -> {System.out.println(s);};con.accept("hello,world!");
- void accept(T t)
Supplier
供给型接口 - T get()
Supplier<Integer> su = ()->{return 1;};Supplier<Integer> su1 = ()-> 1;System.out.println(su1.get());
- T get()
Function
函数型接口 - R apply(T t)
Function<Integer, String> fun = (i) -> {return i + "";};Function<Integer, String> fun1 = i -> i + "";fun.apply(11);
- R apply(T t)
Predicate
断定型接口 - boolean test(T t)
```java
Predicate
pr = (i)->{ if (Integer.valueOf(1).equals(i)) {
} else {return false;
} };return true;
System.out.println(pr.test(11)); ```
- boolean test(T t)
```java
Predicate
方法引用(Method Reference)
- 当要传递给Lambda体的操作 ,已经有了实现的方法了,可以使用方法引用!
- 即Lambda表达式深层次表达
使用格式 类(对象):方法名
- 具体使用
对象 :: 实例方法 ```java @Test public void ii(){ //lambda Consumer
con1 =str -> System.out.println(str); con1.accept(“hello lambda”); //方法引用 PrintStream ps = System.out; Consumer
con2 = ps::println; con2.accept(“hello method reference”);
}
- 类 :: 静态方法```java//Comparator中的int compare(T t1,T t2)//Integer中的int compare(T t1,T t2)@Testpublic void test3() {Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);System.out.println(com1.compare(12,21));//method referenceComparator<Integer> com2 = Integer::compare;System.out.println(com2.compare(12,3));Arrays.sort(array, String::compareTo);}
类 :: 非静态方法
// Comparator中的int comapre(T t1,T t2)// String中的int t1.compareTo(t2)@Testpublic void test5() {//lambdaComparator<String> com1 = (s1,s2) -> s1.compareTo(s2);System.out.println(com1.compare("abc","abd"));//方法引用Comparator<String> com2 = String :: compareTo;System.out.println(com2.compare("abd","abm"));}
构造器引用
- 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
- 抽象方法的返回值类型即为构造器所属的类的类型
使用:
@Testpublic void test1(){//normalSupplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};//lambdaSupplier<Employee> sup1 = () -> new Employee();System.out.println(sup1.get());//constructor conferenceSupplier<Employee> sup2 = Employee :: new;System.out.println(sup2.get());}
数组引用
写法与构造器引用一致。
@Testpublic void test4(){Function<Integer,String[]> func1 = length -> new String[length];String[] arr1 = func1.apply(5);System.out.println(Arrays.toString(arr1));//数组引用Function<Integer,String[]> func2 = String[] :: new;String[] arr2 = func2.apply(10);System.out.println(Arrays.toString(arr2));}
