lambda表达式简介
lambda表达式是一个传递的代码块,可以在以后执行一次或者多次。这个特性是JDK1.8之后的特性。
lambda表达式使用场景
在jdk中有一个Arrays.sort()
方法用来对数组进行排序,在没有用lambda表达式之前我们一般用匿名内部类来传递比较条件,但是出现lambda表达式之后,这个就可以替换掉了。
import java.util.Arrays;
import java.util.Comparator;
/**
* @author justLym
* @version 1.0.0 2020/3/11 18:37
**/
public class Demo {
public static void main(String[] args) {
Integer[] arr = {1, 3, 5, 2, 0};
// 匿名内部类做法
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
// lambda表达式做法
Arrays.sort(arr, ((o1, o2) -> o1 - o2));
}
}
lambda表达式语法
接口方法无参数无返回值
lambda表达式小括号中没有参数,就像我们普通方法一样没有参数也需要括号,在大括号中写方法的实现,当我们方法实现只有一句话时,可以省略大括号。
/**
* @author justLym
* @version 1.0.0 2020/3/11 18:45
**/
interface Function {
void test();
}
public class Demo1 {
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
demo1.test(() -> System.out.println("justLym"));
}
public void test(Function function) {
function.test();
}
}
接口方法有参数,无返回值
在lambda表达式的小括号中填写形式参数,形式参数类型可以不用填写,在大括号中写抽象方法的实现,当方法实现只有一句话时,大括号一样可以省略。
/**
* @author justLym
* @version 1.0.0 2020/3/11 18:53
**/
interface Function2 {
void test(String str);
}
public class Demo2 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.test("justLym", (str -> System.out.println(str)));
}
public void test(String str, Function2 function2) {
function2.test(str);
}
}
接口方法有返回值,有参数
在lambda表达式的小括号中,填写形式参数列表,在大括号中填写方法实现,并添加return
语句,当我们方法实现只有一句话的时候,return
语句可以省略,该语句的返回值会自动成为方法的返回值。
/**
* @author justLym
* @version 1.0.0 2020/3/11 19:00
**/
interface Function3 {
String test(String str);
}
public class Demo3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
// 保留return语句
demo3.test("justLym", str -> {return str;});
// 省略return语句,因为只有一句话
demo3.test("justLym", str -> str);
}
public String test(String str, Function3 function3) {
return function3.test(str);
}
}
方法引用
有时可能已经有现成的方法可以完成你想要传递到其他代码的某个动作。
/**
* @author justLym
* @version 1.0.0 2020/3/11 19:10
**/
public class Demo4 {
public static void main(String[] args) {
test("justLym", System.out::print);
}
public static void test(String string,Consumer<String> consumer) {
consumer.accept(string);
}
}
public static void main(String[] args) {
Integer[] arr = {1, 3, 5, 2, 0};
Arrays.sort(arr, Integer::compareTo);
}
实例和静态方法引用方式
- object::instanceMethod
- Class::instanceMethod
- Class::staticMethod
静态方法引用
Class::new
至于我们这样写调用的是哪一个构造方法呢,取决去上下文,jvm自动寻找合适的构造方法
ArrayList<String> names = ....;
Stream<Person> stream = names.stream().map(Person::new);
List<Person> people = stream.collect(Collectors.toList());