Lambda表达式
简化匿名内部类的!!
什么是Lambda表达式?
Lambda表达式是JDK1.8开始之后的新技术,是一种代码的新语法。
是一种特殊写法,
作用:“核心目的是为了简化匿名内部类的代码写法”。Lambda表达式的格式:
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}-> 就是一个新语法,没有实际含义,但是不能省略!
Lambda表达式的使用前提:
(1)Lambda表达式并不能简化所有匿名内部类的写法。
(2)Lambda表达式只能简化接口中只有一个抽象方法的匿名内部类形式。Lambda表达式只能简化函数式接口的匿名内部类写法:
a.首先必须是接口。
b.接口中只能有一个抽象方法。小结:
Lambda表达式只能简化接口中只有一个抽象方法的匿名内部类写法。
接口中只有一个抽象方法的接口称为函数式接口。
Lambda只能简化函数式接口的匿名内部类写法。
public class LambdaDemo01 {
public static void main(String[] args) {
Thread t = new Thread(() -> System.out.println(Thread.currentThread().getName() + "正在执行~"));
t.start();
}
}
简化Runnable接口的匿名内部类形式
@FunctionalInterface函数式接口注解:
一旦某个接口加上了这个注解,这个接口只能有且仅有一个抽象方法。
这个接口就可以被Lambda表达式简化。
public class LambdaDemo02 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("正在执行~~");
}
});
}
}
简化后
public class LambdaDemo02 {
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println("正在执行~~"));
}
}
简化后
public class LambdaDemo02 {
public static void main(String[] args) {
new Thread(() -> System.out.println("正在执行~~")).start();
}
}
简化Comparator接口的匿名内部类形式
public class LambdaDemo03 {
public static void main(String[] args) {
List<Student> lists = new ArrayList<>();
Student s1 = new Student("李铭", 18, '男');
Student s2 = new Student("冯龙", 23, '男');
Student s3 = new Student("王乐乐", 21, '男');
Collections.addAll(lists, s1, s2, s3);
//按照年龄升序排序
Collections.sort(lists, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getAge() - s2.getAge();
}
});
System.out.println(lists);
}
}
简化后
public class LambdaDemo03 {
public static void main(String[] args) {
List<Student> lists = new ArrayList<>();
Student s1 = new Student("李铭", 18, '男');
Student s2 = new Student("冯龙", 23, '男');
Student s3 = new Student("王乐乐", 21, '男');
Collections.addAll(lists, s1, s2, s3);
//按照年龄升序排序
lists.sort(Comparator.comparingInt(Student::getAge));
System.out.println(lists);
}
}
Lambda表达式省略写法
Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)
(1)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
(2)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。
此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
(3)参数类型可以省略不写。
(4)如果只有一个参数,参数类型可以省略,同时()也可以省略。
public class LambdaDemo01 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("胡伟光");
names.add("甘挺");
names.add("洪磊");
names.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
names.forEach((String s) -> {
System.out.println(s);
});
names.forEach((s) -> {
System.out.println(s);
});
names.forEach(s -> {
System.out.println(s);
});
names.forEach(s -> System.out.println(s) );
names.forEach(System.out::println);
}
}