Java 8 Lambda表达式的使用

Wesley13
• 阅读 723
  • lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
  • Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。

  实现一个接口(功能接口)中的唯一方法(老办法):

1、接口中的方法无返回值:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     void run();
 5 }
 6 public class Main 
 7 {
 8 
 9     public static void main(String[] args) 
10     {
11         RunTask r=new RunTask() 
12         {
13             public void run()
14             {
15                 System.out.println("我是线程要执行的任务");
16             }
17         };
18         r.run();
19     }
20 }

  首先要创建一个类,这个类实现了这个功能接口,然后在类中对方法进行实现。然后实例化一个这个类的对象r,由对象调用run()方法。(此处使用匿名内部类)

Lambda表达式形式:

  Java提供了一个新的操作符"->" 这个操作符之前有一个括号,括号里面就是接口中的那个唯一的方法的参数列表,操作符后面就是我们以前实现接口中的方法中的语句,具体就以上面的代码为参照。

  使用前提:

  ①接口中就只有一个抽象方法,也就是我们刚刚定义的接口,里面就只能有一个抽象方法。

2、接口中的方法有返回值:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     String run();
 5 }
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         RunTask r=()->System.currentTimeMillis()%2==0?"当前的毫秒值能被2整除":"不能被2整除";
11         String value=r.run();
12         System.out.println(value);
13     }
14 }

  也就是说,如果返回值是一个String类型的,则”->”后面跟的就必须是一个字符串。调用run()方法时,返回的就是这个字符串。

3、接口中的方法有参数:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     String run(String name);
 5 }
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         RunTask r=(who)->who+"在调用我";
11         String value=r.run("Peter");
12         System.out.println(value);
13     }
14 }        //输出    Peter在调用我

  操作符"->“前面的括号中写了一个参数的变量名,然后你可以看到这个变量在后面的语句中我们就可以使用了!方法中的参数接收一个String类型的,所以who这个变量就必须是字符串类型的,所以who前面可以加一个String。

4、实现比较器接口:

 1 package JDK8Test;
 2 import java.util.*;
 3 
 4 public class Main 
 5 {
 6     public static void main(String[] args) 
 7     {
 8         ArrayList<Integer> list=new ArrayList<Integer>();
 9         list.add(5);
10         list.add(8);
11         list.add(6);
12         System.out.println(list);
13         Collections.sort(list, (Integer a,Integer b)->a-b);
14         System.out.println(list);
15     }
16 }        
17 //[5, 8, 6]
18 //[5, 6, 8]

  可以看得到”->" 操作符前面是接口中的方法的参数列表,后面是实现接口的方法中的表达式。

5、实现Consumer接口,遍历集合(老方法):

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.function.Consumer;
 4 
 5 public class Main 
 6 {
 7     public static void main(String[] args) 
 8     {
 9         ArrayList<Integer> list=new ArrayList<Integer>();
10         list.add(5);
11         list.add(8);
12         list.add(6);
13         Two two=new Two();
14         list.forEach(two);
15     }
16 }    
17 class Two implements Consumer<Integer>
18 {
19     public void accept(Integer t)
20     {
21         System.out.println("遍历中"+t);
22     }
23 }
24 /*输出:
25  遍历中5
26 遍历中8
27 遍历中6 
28 */

Lambda表达式方法:

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.function.Consumer;
 4 
 5 public class Main 
 6 {
 7     public static void main(String[] args) 
 8     {
 9         ArrayList<Integer> list=new ArrayList<Integer>();
10         list.add(5);
11         list.add(8);
12         list.add(6);
13         Consumer<Integer> r=(Integer t)->System.out.println("遍历中"+t);
14         list.forEach(r);
15     }
16 }    
17 /*输出:
18 遍历中5
19 遍历中8
20 遍历中6 
21 */

5、”->”后面有{}包裹:

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.Collections;
 4 import java.util.function.Consumer;
 5 
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         ArrayList<Integer> list=new ArrayList<Integer>();
11         list.add(5);
12         list.add(8);
13         list.add(6);
14         System.out.println(list);
15         Collections.sort(list, (Integer a,Integer b)->{return a-b;});
16         System.out.println(list);
17     }
18 }    
19 /*输出:
20 [5, 8, 6]
21 [5, 6, 8]
22 */

  没有{}和有{}的区别是:
  ①没有{}包裹的不用写return 关键字,有{}包裹的,如果有返回值,必须使用return 关键字返回数据
  ②没有{}包裹的只能写一个语句,而有{}包裹的可以写任意多条语句。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 8 lambda表达式中的异常处理
java8lambda表达式中的异常处理简介java8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的FunctionalInterface并没有很好的处理异常,因为JDK提供的这些FunctionalInterface通常都是没有抛出异常的,这意味着需要我们自
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Lambda表达式中Collections的接口有哪些变化?
我们先从最熟悉的\Java集合框架(JavaCollectionsFramework,JCF)\开始说起。为引入Lambda表达式,Java8新增了java.util.function包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。首先回顾一下Java集合框架的接口继承
Wesley13 Wesley13
3年前
JAVA之forEach遍历集合
JAVA之forEach遍历集合在JDK8中,根据Lambda表达式的特性还增加了一个forEach(Consumeraction)方法来遍历集合,该方法所需要的参数是一个函数式接口importjava.util.ArrayList;importjava.util.List;
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式
1、Java中过滤出字母、数字和中文的正则表达式(1)过滤出字母的正则表达式\^(AZaz)\(2)过滤出数字的正则表达式\^(09)\(3)过滤出中文的正则表达式\^(\\\\u4e00\\\\u9fa5)\(4)过滤出字母、数字和中文的正则表达式\^(azAZ09\\\\u