目录
JDK8新特性
官网提供网址:JDK 8 Features
2.Lambda表达式
思维导图
2.1 什么是Lambda表达式
Lamdba是一个匿名函数,可以把Lamdba表达式理解为是一段可以传递的代码。使用它可以写出更简洁、灵活的代码。作为一种更紧凑风格,使Java语言表达能力得到提升
2.2 为什么使用Lamdba表达式
更加简洁的编写方式
2.3 Lambda表达式基本语法(参数类型 参数名称,...) -> { 代码体; [return 值;] }
(参数类型 参数名称,...) : 指定了Lambda表达式所需要的参数列表
{ }:指定了Lambda体,是抽象方法的实现逻辑,Lambda表达式要执行的功能
->:Lambda操作符,箭头操作符,分隔参数列表和Lambda体
2.4 类型推断
Lambda表达式中的参数类型都是由编译器推断得出,Lambda表达式中无需指定类型,程序依然可以翻译。
因为Javac会根据程序的上下文环境,在后台推断出参数类型,这就是“类型推断”
2.5 Lambda练习
案例1:
interface Fiyable { void flying(); } public class LambdaExpressionNoArg { public static void main(String[] args) { fly(new Fiyable() { @Override public void flying() { System.out.println("I can fly"); } }); //1.无参无返回值 fly(() ->{ System.out.println("I can fly"); }); } public static void fly(Fiyable f) { f.flying(); } }
运行结果:
如何使用Lambda表达式:
案例2:
interface Sayable{ void say(String name); } public class LambdaExpressionOneArg { public static void main(String[] args) { talk(new Sayable() { @Override public void say(String name) { System.out.println("name:" + name); } }); //2.一个参无返回值 talk((String name) ->{ System.out.println("name:" + name); }); //3.数据类型可以省略 talk(( name) ->{ System.out.println("name:" + name); }); //4.只有一个参数,括号可以省略 talk( name ->{ System.out.println("name:" + name); }); //5,如果Lambda体只有一条语句,{}; 可以省略 talk( name -> System.out.println("name:" + name)); } public static void talk(Sayable sayable) { sayable.say("张三"); } }
运行结果:
2.6 Lambda常用场景
排序场景、
如果一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式,用匿名实现类表示的地方都可以用Lambda表达式替换
案例3:
先定义一个Person类
/** * 对这个对象进行,按照年纪排序 */ public class Person { private String name; private int age; private int height; public Person(String name, int age, int height) { this.name = name; this.age = age; this.height = height; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } public String getName() { return name; } public int getAge() { return age; } public int getHeight() { return height; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setHeight(int height) { this.height = height; } }
在写一个LambdaExpressionExercise类,完成对Person对象,进行按照年龄排序
public class LambdaExpressionExercise { public static void main(String[] args) { List<Person> persons = new ArrayList<>(); persons.add(new Person("张三",20,170)); persons.add(new Person("李四",19,170)); persons.add(new Person("王五",18,170)); // Collections.sort(persons, new Comparator<Person>() { // @Override // public int compare(Person o1, Person o2) { // return o1.getAge()-o2.getAge(); // } // }); Collections.sort(persons, (o1, o2) -> o1.getAge()-o2.getAge()); for (Person person : persons) { System.out.println(person.toString()); } } }
运行结果