JDK1.8 之Lambda表达式

更多精彩技术分享请浏览本人博客:https://blog.csdn.net/wohiusdashi

 

概述

Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。

你可以将其想做一种速记,在你需要使用某个方法的地方写上它。当某个方法只使用一次,而且定义很简短,使用这种速记替代之尤其有效,这样,你就不必在类中费力写声明与方法了。
 

Lambda 表达式的结构

  • 一个 Lambda 表达式可以有零个或多个参数
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
  • 空圆括号代表参数集为空。例如:() -> 42
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

什么是函数式接口


在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口。

语法

parameter -> expression body

下面是一个lambda表达式的重要特征。

  • 可选类型声明 - 无需声明参数的类型。编译器可以从该参数的值推断。

  • 可选圆括号参数 - 无需在括号中声明参数。对于多个参数,括号是必需的。

  • 可选大括号 - 表达式主体没有必要使用大括号,如果主体中含有一个单独的语句。

  • 可选return关键字 - 编译器会自动返回值,如果主体有一个表达式返回的值。花括号是必需的,以表明表达式返回一个值。

变量作用域:

  在lambda表达式,可以指任何最终的变量或有效的最后一个变量(被分配一次)。如果变量被二次赋值,lambda表达式将抛出编译错误。

小牛试刀

实践是检验真理的唯一标准,哈哈,请看

 new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是传统的写法");
            }
        }).start();
//------------------------------------------------------------
new Thread(() -> System.out.println("我是Lambda的写法")).start();

输出结果:

JDK1.8 之Lambda表达式_第1张图片

从以上代码可以看出使用Lambda表达式的好处就是节省代码量,因为使用Lambda表达式只需要一行代码可以搞定的事情使用传统写法需要6行代码。

如果您认为Lambda表达式只是用来简化代码量的话,那您就大错特错了,哈哈,下面请看Lambda表达式更高级用法

1、 forEach遍历输出

奉上代码:

 List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println("传统遍历输出方式");
        for(String str : list){
            System.out.println(str);
        }
        System.out.println("Lambda表达遍历输出方式");
        list.forEach(System.out::println);

输出结果:

JDK1.8 之Lambda表达式_第2张图片

2、条件过滤

奉上代码:

 List list = new ArrayList();
        for(int i = 0 ;i < 100; i++)
            list.add(i);
        //过滤小于90的数字
        List newList = list.stream().filter(a -> a >90).collect(Collectors.toList());
        newList.forEach(System.out::println);

输出结果:

JDK1.8 之Lambda表达式_第3张图片

3、批量增、减操作

奉上代码:

        List list = Arrays.asList(3000.0,5000.0,8000.0,10000.0,20000.0,50000.0);
        //大BOSS发话,从现在开始每个程序员涨薪 30%
        System.out.println("------------传统写法");
        for(Double salary :  list){
            System.out.println(salary * 1.3);
        }
        System.out.println("------------Lambda 表达式写法");
        list.stream().map(a -> a*1.3).forEach(System.out::println);

输出结果:

JDK1.8 之Lambda表达式_第4张图片

4、求最大值、最小值、平均值

奉上代码:

List list = new ArrayList();
        for(int i = 0 ;i < 100; i++)
            list.add(i);
        IntSummaryStatistics iss =list.stream().mapToInt((x) -> x).summaryStatistics();
        System.out.println("最大值: "+iss.getMax());
        System.out.println("最小值: "+iss.getMin());
        System.out.println("平均值: "+iss.getAverage());

输出结果:

JDK1.8 之Lambda表达式_第5张图片JDK1.8 之Lambda表达式_第6张图片

 

一不留神看了下时间,现在都晚上12点了,也该睡觉了,还有关于 @FunctionalInterface、中间操作、终值操作 等其它内容 只能下次再进行讲解,感兴趣的朋友可以关注我,哈哈。

 

更多精彩技术分享请浏览本人博客:https://blog.csdn.net/wohiusdashi

 

你可能感兴趣的:(JDK1.8 之Lambda表达式)