Lambda
-
冗余Runnable代码—Lambda优化
-
RunnableImpl类
package cn.xiaoge.day17.demo15; /* 创建Runnable接口的实现类, 重写run方法, 设置线程任务 */ public class RunnableImpl implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新的线程创建"); } }
-
执行路口
package cn.xiaoge.day17.demo15; /* 使用实现Runnable接口的方式实现多线程程序 */ public class Demo01Runnable { public static void main(String[] args) { // 创建Runnable接口的实现类对象 RunnableImpl run = new RunnableImpl(); // 创建Thread类对象, 构造方法中传递Runnable接口的实现类 Thread t = new Thread(run); // 调用start方法开启新线程, 执行run方法 t.start(); // 简化代码, 使用匿名内部类, 实现多线程程序 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新的线程创建"); } }).start(); } } // 运行结果 Thread-0新的线程创建 Thread-1新的线程创建
-
执行路口
package cn.xiaoge.day17.demo15; /* Thread implements Runnable Lambda表达式的标准格式: 有三部分组成: a. 一些参数 b. 一个箭头 c. 一段代码 格式: (参数列表) -> {一些重写方法的代码}; 解释说明格式: (): 接口中抽象方法的参数列表, 没有参数, 就空着; 有参数就写出参数, 多个参数用逗号分隔 ->: 传递的意思, 把参数传递给方法体{} {}: 重写接口的抽象方法的方法体 */ public class Demo02Lambda { public static void main(String[] args) { // 使用匿名内部类, 实现多线程程序 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新的线程创建"); } }).start(); // 使用Lambda表达式, 实现多线程 new Thread( () -> { System.out.println(Thread.currentThread().getName() + "新的线程创建"); }).start(); // 优化省略Lambda new Thread( () -> System.out.println(Thread.currentThread().getName() + "新的线程创建")).start(); } } // 运行结果 Thread-0新的线程创建 Thread-1新的线程创建 Thread-2新的线程创建
-
-
Lambda无参无返回值的
-
Cook接口
package cn.xiaoge.day17.demo16; public interface Cook { public abstract void makeFood(); }
-
执行路口
package cn.xiaoge.day17.demo16; /* 需求: 给定一个厨子Cook接口, 内容唯一的抽象方法makeFood, 且无参数, 无返回值. 使用Lambda的标准格式调用invokeCook方法, 答应输出"吃饭啦! "字样 */ public class Demo01Cook { public static void main(String[] args) { // 调用invokeCook方法, 参数是Cook接口, 传递Cook接口的匿名内部内 invokeCook(new Cook() { @Override public void makeFood() { System.out.println("吃饭啦! "); } }); // 使用Lambda表达式, 简化匿名内部类的书写 invokeCook(() -> { System.out.println("吃饭啦! "); }); // 优化Lambda invokeCook(() -> System.out.println("吃饭啦! ")); } // 定义一个方法, 参数传递Cook接口, 方法内部调用Cook接口中的方法makeFood public static void invokeCook(Cook cook) { cook.makeFood(); } } // 运行结果 吃饭啦! 吃饭啦! 吃饭啦!
-
-
Lambda表达式有参数的返回值的练习
-
Person类
package cn.xiaoge.day17.demo17; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
-
执行路口
package cn.xiaoge.day17.demo17; /* Lambda表达式有参数的返回值的练习 需求: 使用数组存储多个Person对象 对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序 */ import java.util.Arrays; import java.util.Comparator; public class Demo01Arrays { public static void main(String[] args) { Person[] person = { new Person("柳岩", 38), new Person("迪丽热巴", 18), new Person("古力娜扎", 19), }; // 对数组中的Person对象使用Arrays的sort方法通过年龄进行升序(前边-后边)排序 /*Arrays.sort(person, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge()-o2.getAge(); } }); System.out.println(Arrays.toString(person)); // [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}] */ // 使用Lambda表达式, 简化匿名内部类 Arrays.sort(person, (Person p1, Person p2)->{ return p1.getAge() - p2.getAge(); }); System.out.println(Arrays.toString(person)); // [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}] // 优化Lambda Arrays.sort(person, (p1, p2)-> p1.getAge() - p2.getAge()); } } // 运行结果 [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}]
-
-
Lambda表达式有参数有返回值的练习
-
Calculator接口
package cn.xiaoge.day17.demo18; /* 定义一个计算器Calculator接口, 内含抽象方法calc可以将两个int数字相加得到和值 */ public interface Calculator { // 定义一个计算两个int整数和的方法并返回结果 public abstract int calc(int a, int b); }
-
执行路口
package cn.xiaoge.day17.demo18; /* Lambda表达式有参数有返回值的练习 需求: 给定一个计算器Calculator接口, 内含抽象方法calc可以将两个int数字相加得到和值 使用Lambda的标准格式调用invokeCalc方法, 完成120和130相加计算 */ public class Demo01Calculator { public static void main(String[] args) { // 调用invokeCalc方法, 方法的参数是一个接口, 可以使用匿名内部类 /*invokeCalc(10, 20, new Calculator() { @Override public int calc(int a, int b) { return a + b; } });*/ // 使用Lambda表达式简化匿名内部类的写法 invokeCalc(120, 130, (int a, int b)->{ return a + b; }); // 优化Lambda invokeCalc(120, 130, (a, b)-> a + b); } /* 定义一个方法 参数传递两个int类型的整数 参数传递Calculator接口 方法内部调用Calculator中的方法calc计算两个整数的和 */ public static void invokeCalc(int a, int b, Calculator c) { int sum = c.calc(a, b); System.out.println(sum); } } // 运行结果 250 250
-
-
Lambda使用前提
-
执行路口
package cn.xiaoge.day17.demo19; /* Lambda表达式: 是可推导, 可以省略 凡是根据上下文推导出来的内容, 都可以省略不写 可以省略的内容: 1. (参数列表): 括号中参数列表的数据类型, 可以省略不写 2. (参数列表): 括号中的参数如果只有一个, 那么类型和()都可以省略 3. (一些代码): 如果()中的代码只有一行, 无论是否包含返回值, 都可以省略({}, return, 分号) 注意: 要省略{}, return, 分号必须一起省略 */ /* Lambda使用前提: Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意: 1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。 无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。 2. 使用Lambda必须具有上下文推断。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。 备注:有且仅有一个抽象方法的接口,称为“函数式接口”。 */ import java.util.ArrayList; public class Demo01ArrayList { public static void main(String[] args) { // JDK1.7版本之前, 创建集合对象必须把前后的泛型写上 ArrayList<String> list01 = new ArrayList<String>(); // JDK1.7版本之后, =号后边的泛型可以省略, 后边的泛型可以根据前边的泛型推到出来 ArrayList<String> list02 = new ArrayList<>(); } }
-