- -> lambda *** 作符,或者我们也称之为箭头 *** 作符
- -> 的左边 : lambda形参列表 ---- 其实也就是函数式接口中的抽象方法的方法体
- -> 的右边 : lambda体 — 就是我们要重写的抽象方法的方法体 — 就是具体我们要如何实现
- 语法格式一: 无参,无返回值 eg:创建Runnable接口的实现类对象时
package Lambda表达式; public class Demo2 { public static void main(String[] args) { Runnable runnable = () -> { System.out.println("我爱北京天安门"); }; runnable.run(); } }
- 语法格式二: 有参,无返回值 eg:创建Consumer接口实现类的对象时 这里我们是使用的匿名内部类的方式
package Lambda表达式; import java.util.function.Consumer; public class Demo5 { public static void main(String[] args) { //这里我们就是使用匿名内部类的方式创建了一个consumer接口的实现类的对象 Consumer
这里我们使用lambda表达式的方式consumer = new Consumer<>(){ public void accept(String s){ System.out.println(s); } }; consumer.accept("谎言和誓言最大的区别是什么?"); } } package Lambda表达式; import java.util.function.Consumer; public class Demo6 { public static void main(String[] args) { Consumer
consumer = (String s) -> { System.out.println(s); }; consumer.accept("一个是听的人当真了,一个是说的人当真了!"); } } - 语法格式三: 数据类型可以省略,因为数据类型可以由编译器推断得出 — 我们也称之为"类型推断" eg:创建Consumer接口的实现类的对象 这里我们直接使用lambda表达式的方式
package Lambda表达式; import java.util.function.Consumer; public class Demo7 { public static void main(String[] args) { Consumer
consumer = (s) -> { System.out.println(s); }; } }
- 我们之前也碰到过很多类型推断的情况
- 我们在创建泛型类对象的时候可以左加右不加
eg:
ArrayList
list = new ArrayList<>(); - 这个时候我们按理来说两边都要加上泛型,但是这个时候我们左边加上右边没有加,这个时候就是一种类型推断,由左边声明的ArrayList<泛型> 来确定实际的new ArrayList<泛型>;
- 简化创建一维数组的时候
eg:
int arr = {1,2,3};
- 这个时候也是一种类型推断 ,按理说应该是: int arr = new int[]{1,2,3};
- 这个时候也是由我们声明的arr的类型int来确定了后面new数组类型也是int ,这个是由编译器自动进行的类型推断
- 我们在创建泛型类对象的时候可以左加右不加
- 语法格式四: 当我们的接口中的抽象方法只有一个参数时,这个时候参数的小括号可以省略 eg:创建Consumer接口实现类对象 这里我们直接使用lambda表达式的方式:
package Lambda表达式; import java.util.function.Consumer; public class Demo8 { public static void main(String[] args) { //这里由于我们的accept()方法只有一个参数,这个时候我们就可以省略掉这个参数的(),也就是省略小括号 Consumer
consumer = s -> { System.out.println(s); }; consumer.accept("一个是听的人当真了,一个是说的人当真了"); } } - 语法格式五:需要两个或者两个以上的参数, 多条执行语句,并且有返回值 eg:创建Comparator接口的实现类的对象 这里我们先使用匿名内部类的方式来创建Comparator接口的实例化对象
package Lambda表达式; import java.util.Comparator; public class Demo9 { public static void main(String[] args) { Comparator
接下里我们使用lambda表达式的方式来创建Comparator接口的实现类的对象comparator = new Comparator<>(){ public int compare(Integer i1 , Integer i2){ System.out.println(i1); System.out.println(i2); //这里我们调用了Integer类中的compare()静态方法 return Integer.compare(i1,i2); } }; comparator.compare(1,2); } } package Lambda表达式; import java.util.Comparator; public class Demo10 { public static void main(String[] args) { Comparator
comparator = (i1,i2) -> { System.out.println(i1); System.out.println(i2); return Integer.compare(i1,i2); }; comparator.compare(1,2); } } - 语法格式六: 当lambda体中只要一条java语句时,这个时候return和一对大括号{}都可以省略
- 但是要注意: 这个时候如果我们要省略{},就要和return一起省略,如果要省内return就要和{}一起省略,反正就是要省略就要两个一起省略,如果要不省略就两个都不省略
package Lambda表达式; import java.util.Comparator; public class Demo11 { public static void main(String[] args) { //这个时候我们直接省略了lambda体的return和{} Comparator
comparator = (i1,i2) -> Integer.compare(i1,i2); comparator.compare(1,2); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)