JDK1.8 之Lambda表达式

概述
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();

输出结果:

从以上代码可以看出使用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);

输出结果:

2、条件过滤

奉上代码:

List list = new ArrayList();

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

输出结果:

3、批量增、减操作

奉上代码:

    List<Double> 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);

输出结果:

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());

输出结果:

————————————————
版权声明:本文为CSDN博主「不甘于平凡的溃败」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wohiusdashi/article/details/88980803

posted @ 2019-12-17 18:15  fxsen  阅读(210)  评论(0编辑  收藏  举报