Java 8 Lambda表达式的使用

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

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

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

1 1 package JDK8Test; 2 2 interface RunTask 3 3 { 4 4 void run(); 5 5 } 6 6 public class Main 7 7 { 8 8 9 9 public static void main(String[] args) 1010 { 1111 RunTask r=new RunTask() 1212 { 1313 public void run() 1414 { 1515 System.out.println("我是线程要执行的任务"); 1616 } 1717 }; 1818 r.run(); 1919 } 2020 }

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

  Lambda表达式形式:

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

  使用前提:

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

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

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

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

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

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

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

  4、实现比较器接口:

1 1 package JDK8Test; 2 2 import java.util.*; 3 3 4 4 public class Main 5 5 { 6 6 public static void main(String[] args) 7 7 { 8 8 ArrayList<Integer> list=new ArrayList<Integer>(); 9 9 list.add(5); 1010 list.add(8); 1111 list.add(6); 1212 System.out.println(list); 1313 Collections.sort(list, (Integer a,Integer b)->a-b); 1414 System.out.println(list); 1515 } 1616 } 1717 //[5, 8, 6] 1818 //[5, 6, 8]

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

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

1 1 package JDK8Test; 2 2 import java.util.ArrayList; 3 3 import java.util.function.Consumer; 4 4 5 5 public class Main 6 6 { 7 7 public static void main(String[] args) 8 8 { 9 9 ArrayList<Integer> list=new ArrayList<Integer>(); 1010 list.add(5); 1111 list.add(8); 1212 list.add(6); 1313 Two two=new Two(); 1414 list.forEach(two); 1515 } 1616 } 1717 class Two implements Consumer<Integer> 1818 { 1919 public void accept(Integer t) 2020 { 2121 System.out.println("遍历中"+t); 2222 } 2323 } 2424 /*输出: 2525 遍历中5 2626 遍历中8 2727 遍历中6 2828 */

  Lambda表达式方法:

1 1 package JDK8Test; 2 2 import java.util.ArrayList; 3 3 import java.util.function.Consumer; 4 4 5 5 public class Main 6 6 { 7 7 public static void main(String[] args) 8 8 { 9 9 ArrayList<Integer> list=new ArrayList<Integer>(); 1010 list.add(5); 1111 list.add(8); 1212 list.add(6); 1313 Consumer<Integer> r=(Integer t)->System.out.println("遍历中"+t); 1414 list.forEach(r); 1515 } 1616 } 1717 /*输出: 1818 遍历中5 1919 遍历中8 2020 遍历中6 2121 */

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

1 1 package JDK8Test; 2 2 import java.util.ArrayList; 3 3 import java.util.Collections; 4 4 import java.util.function.Consumer; 5 5 6 6 public class Main 7 7 { 8 8 public static void main(String[] args) 9 9 { 1010 ArrayList<Integer> list=new ArrayList<Integer>(); 1111 list.add(5); 1212 list.add(8); 1313 list.add(6); 1414 System.out.println(list); 1515 Collections.sort(list, (Integer a,Integer b)->{return a-b;}); 1616 System.out.println(list); 1717 } 1818 } 1919 /*输出: 2020 [5, 8, 6] 2121 [5, 6, 8] 2222 */

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 8 lambda表达式中的异常处理

java8lambda表达式中的异常处理简介java8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的FunctionalInterface并没有很好的处理异常,因为JDK提供的这些FunctionalInterface通常都是没有抛出异常的,这意味着需要我们自

Lambda表达式中Collections的接口有哪些变化?

我们先从最熟悉的\Java集合框架(JavaCollectionsFramework,JCF)\开始说起。为引入Lambda表达式,Java8新增了java.util.function包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。首先回顾一下Java集合框架的接口继承