Lambda表达式

Posted maybecoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式相关的知识,希望对你有一定的参考价值。

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的省略格式

省略规则

  1. 小括号内参数类型可以省略;

  2. 如果小括号内有且只有一个参数,则小括号可以省略

  3. 如果大括号只有且仅有一个语句,则无论有无返回值,都可以省略大括号,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使用需要注意的几个问题:

  1. 必须有接口,且要求接口中只有且仅有一个抽象方法。

  2. 使用lambda必须有上下文推断:方法的参数或者局部变量必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。



以上是关于Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA由一个将JSONArray转成Map的需求引发的lambda语法的学习

函数式编程

C# fun

Lambda表达式

Lambda表达式

Lambda表达式