为什么需要lamda表达式:
/* 使用实现Runnable接口的方式实现多线程程序 */ public class DemoRunable { public static void main(String[] args) { //创建Runnable接口的实现累对象 RunnableImp run = new RunnableImp(); //创建Thread累对象,构造方法中传递Runnable接口的实现类 Thread t = new Thread(run); //调用start方法开启心线程:执行run方法 t.start(); ///////////内部类简化代码//////////////// Runnable r = new Runnable(){ @Override public void run() { System.out.println(Thread.currentThread().getName()+"心线程"); } }; new Thread(r).start(); ////////////////继续化,去掉r中间对象 new Thread(new Runnable(){ @Override public void run() { System.out.println(Thread.currentThread().getName()+"心线程"); } }).start(); ////////////lamdab表达式 new Thread(() ->{ System.out.println(Thread.currentThread().getName()+"心线程"); }).start(); } }
lambda表达式格式
练习11111
接口:
public interface Cook { //无参数,无返回值 void makeFood(); }
public class DemoCook { public static void main(String[] args) { //调用oCook方法,参数是Cook接口,传递Cook接口的匿名内部类对象 oCook(new Cook() { @Override public void makeFood() { System.out.println("开发"); } }); //使用lambda表达式,简化匿名内部类的书写 oCook(() -> { System.out.println("开发"); }); } //定义一个方法,参数传递cook接口,方法内部调用Cook接口 //的方法makeFood(); private static void oCook(Cook cook){ cook.makeFood(); } }
l例子二:
public class DemoArrays { public static void main(String[] args) { // Person[] arr ={ new Person("AA",31), new Person("BB",22), new Person("CC",33) }; // //对数组中的Person对象使用Array的sort方法同通过年龄进行升序前减后 // Arrays.sort(arr, new Comparator<Person>() { // @Override // public int compare(Person o1, Person o2) { // return o1.getAge() -o2.getAge(); // } // }); //使用lambda表达式 Arrays.sort(arr,(Person o1, Person o2) ->{ return o1.getAge() -o2.getAge(); }); //遍历数组 for (Person person : arr) { System.out.println(person); } } } /* Person{name=‘BB‘, age=22} Person{name=‘AA‘, age=31} Person{name=‘CC‘, age=33} */
例子:有参数有返回值:
给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到的值
public class DemoCalculator { public static void main(String[] args) { invokeCalc(3, 5, new Calculator() { @Override public int calc(int a, int b) { return a+b; } }); ///lambda表达式 invokeCalc(4,6,(int a,int b)->{return a+b;}); } /* 定义一个方法, 参数传递两个int的整数 参数传递Calculator接口 方法内部调用Calculator的方法calc计算两个整数的和 */ public static void invokeCalc(int a,int b,Calculator calculator){ int r =calculator.calc(a,b); System.out.println(r); } }
lambda表达式的省略形式
11111
////////////lamdab表达式 new Thread(() -> { System.out.println(Thread.currentThread().getName() + "心线程"); }).start(); ////简洁的lambda表达式 new Thread(()->System.out.println(Thread.currentThread().getName() + "心线程")).start();
2222
//使用lambda表达式,简化匿名内部类的书写 oCook(() -> { System.out.println("开发"); }); //简洁的lambda表达式: oCook(()-> System.out.println("kaifa"));
33333
//使用lambda表达式 Arrays.sort(arr,(Person o1, Person o2) ->{ return o1.getAge() -o2.getAge(); }); Arrays.sort(arr,(o1, o2)-> o1.getAge() -o2.getAge());
要省略,一定要三个一起省略:
不能出现下面的情况:
Arrays.sort(arr,(o1, o2)-> return o1.getAge() -o2.getAge());
4444
///lambda表达式 invokeCalc(4,6,(int a,int b)->{return a+b;}); //简介表达式: invokeCalc(4,6,(a,b)->a+b);
有且仅有一个抽象方法的接口,成为函数式接口
原文:https://www.cnblogs.com/java-quan/p/13185558.html