Lambda表达式
Posted maybecoding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式相关的知识,希望对你有一定的参考价值。
初识lambda
Lambda表达式是Java8的新特性,采用的思想是函数式编程的思想。也就是强调做什么,而不是怎么做。
先来看一个例子
1 public class LambdaTest01 { 2 public static void main(String[] args) { 3 Runnable runnable = new Runnable() { 4 @Override 5 //重写run方法 6 public void run() { 7 System.out.println("重写run方法"); 8 } 9 }; 10 //启动线程 11 new Thread(runnable).start(); 12 } 13 }
对以上代码进行分析,首先Thread需要一个runnable接口的对象作为参数传递进来,其中传入的runnable接口对象的run方法是实际执行的业务操作。
在这段代码中,为了实现run()的逻辑操作,我们必须有Runnable的实现类,从而不得不实现(重写)run方法,然后就使用了匿名内部类。
但是我们只关注这段方法究竟做了什么逻辑操作,这个才是个我们关心的重点。
以下我们借助java8的特性Lambda表达式来看一下,如何简化以上操作:
?
1 public class LambdaTest02 { 2 3 public static void main(String[] args) { 4 5 //(参数类型 参数名称) ->{ 代码语句 } 6 new Thread(()-> System.out.println("线程开始执行")).start(); 7 8 } 9 }
对比示例1和示例2,可以看出lambda表达式带来的简便。
Lambda表达式标准格式
Lambda由三个部分组成
1.参数 2.一个箭头 3.一段代码
Lambda表达式的标准格式为:
?
(参数类型 参数名称) ->{ 代码语句 }
格式说明:
-
小括号内是参数类型和参数名称,如果没有参数,可以什么都不写,多个参数则用逗号分隔
-
->
是lambda表达式新引进d的语法格式,代表指向操作 -
大括号与传统的代码 一样,写具体实现。
Lambda表达式无参无返回值
给定一个接口Game
1 public interface Game { 2 void playGame(); 3 }
?
使用lambda表达式输出"玩游戏了"
1 public class LambdaTest3 { 2 public static void main(String[] args) { 3 invokeGame(()->{ 4 System.out.println("玩游戏了"); 5 }); 6 } 7 ? 8 public static void invokeGame(Game game){ 9 game.playGame(); 10 } 11 }
Lambda的参数和返回值
以java.util.Comparator<T>
接口为例:
其中抽象方法为:public abstract int compare(T o1,T o2);
使用lambda表达式对人物角色排序
1 public class Person { 2 private String name; 3 private int age; 4 ? 5 public Person() { 6 } 7 ? 8 public Person(String name, int age) { 9 this.name = name; 10 this.age = age; 11 } 12 ? 13 public String getName() { 14 return name; 15 } 16 ? 17 public void setName(String name) { 18 this.name = name; 19 } 20 ? 21 public int getAge() { 22 return age; 23 } 24 ? 25 public void setAge(int age) { 26 this.age = age; 27 } 28 ? 29 @Override 30 public String toString() { 31 return "Person{" + 32 "name=‘" + name + ‘‘‘ + 33 ", age=" + age + 34 ‘}‘; 35 } 36 }
排序
1 public class LambdaTest04 { 2 public static void main(String[] args) { 3 Person []person ={ 4 new Person("好运姐",24), 5 new Person("阿狸",19), 6 new Person("拉克丝",16) 7 }; 8 9 Arrays.sort(person,(Person p1,Person p2)->{ 10 return p1.getAge()-p2.getAge(); 11 }); 12 ? 13 for (Person p : person) { 14 System.out.println(p); 15 } 16 } 17 }
Lambda表达式有参有返回值
计算器接口
1 public interface Calculator { 2 int calc(int a,int b); 3 } 4 ?
实现
1 public class LambdaTest05 { 2 public static void main(String[] args) { 3 ? 4 invokeCalc(3,6,(int a ,int b)->{ 5 ? 6 return a+b; 7 }); 8 } 9 private static int invokeCalc(int a,int b,Calculator calculator){ 10 ? 11 int result = calculator.calc(a, b); 12 System.out.println("结果是:"+result); 13 return result; 14 } 15 }
Lambda的省略格式
省略规则
-
小括号内参数类型可以省略;
-
如果小括号内有且只有一个参数,则小括号可以省略
-
如果大括号只有且仅有一个语句,则无论有无返回值,都可以省略大括号,return关键字以及语句分号。
示例:
?
1 public class LambdaTest06 { 2 public static void main(String[] args) { 3 invokeGame(()-> System.out.println("玩游戏了")); 4 } 5 private static void invokeGame(Game game){ 6 game.playGame(); 7 } 8 }
Lambda使用前提
lambda使用需要注意的几个问题:
-
必须有接口,且要求接口中只有且仅有一个抽象方法。
-
使用lambda必须有上下文推断:方法的参数或者局部变量必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
以上是关于Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章