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() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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);}
}