Lambda表达式
举例 (o1, o2) -> Integer.compare(o1, o2);
格式:
- -> lambda操作符h
- 左 lambda形参列表
- 右 lambda体
本质 作为接口的实例
如果一个接口中只声明了一个抽象方法,则此接口就称为函数式接口
用匿名实现类表示的方法现在都可以用Lambda表达式来写
使用
无参 无返回值
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
r1.run();
//使用后
Runnable r2 = () -> System.out.println("hello");
r2.run();
需要一个参数,但不需要返回值
@Test
public void ooo(){
Consumer<String> con = new Consumer<String>() {
@Override
public 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!");
}
}
类型推断
@Test
public 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需要两个或以上的参数,多条执行语句,。并且可以有返回值
@Test
public 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)
@Test
public void test3() {
Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
System.out.println(com1.compare(12,21));
//method reference
Comparator<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)
@Test
public void test5() {
//lambda
Comparator<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"));
}
构造器引用
- 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
- 抽象方法的返回值类型即为构造器所属的类的类型
使用:
@Test
public void test1(){
//normal
Supplier<Employee> sup = new Supplier<Employee>() {
@Override
public Employee get() {
return new Employee();
}
};
//lambda
Supplier<Employee> sup1 = () -> new Employee();
System.out.println(sup1.get());
//constructor conference
Supplier<Employee> sup2 = Employee :: new;
System.out.println(sup2.get());
}
数组引用
写法与构造器引用一致。
@Test
public 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));
}