最近学习到的Lambda表达式-阿里云开发者社区

开发者社区> java3y> 正文

最近学习到的Lambda表达式

简介: 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 中秋去了躺上海,在外滩上打了个卡: 紧接着学了一下Java的函数式编程,给大家整理了一下,一起学习! 一、Lambda用法 之前写Optiona.
+关注继续查看

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

中秋去了躺上海,在外滩上打了个卡:

外滩

紧接着学了一下Java的函数式编程,给大家整理了一下,一起学习!

一、Lambda用法

之前写Optional这个类的时候,简单说了一下Lambda是怎么用的,这里再跟大家一起回顾一下,Lambda的语法是这样的:

语法

以Lambda语法创建线程和匿名内部类创建线程的区别(显然代码少了很多!):

public static void main(String[] args) {
    // 用匿名内部类的方式来创建线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("公众号:Java3y---关注我!");
        }
    });

    // 使用Lambda来创建线程
    new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}

使用Lambda表达式,实际就是创建出该接口的实例对象

返回一个Runnable对象实例

图示;Runnable接口来举例:

以Runnable接口为例

使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法)

函数式编程接口只有一个抽象方法

1.1 函数式编程接口

从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值

JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:

常用的函数式编程接口

简单说明一下:

  • 表格中的一元接口表示只有一个入参,二元接口表示有两个入参

以BiFunction为例

常用的函数式接口

Demo:

// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");

// Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);

//.....

使用Lambda时,要记住的就两点:

  1. Lambda返回的是接口的实例对象
  2. 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口

1.2 方法引用

在学Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");

如果按正常Lambda的写法可能是这样的:

// 普通的Lambda写法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");

显然使用方法引用比普通的Lambda表达式又简洁了一些。

如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用

函数式接口的实现恰好可以通过调用一个方法来实现

方法引用又分了几种:

  • 静态方法的方法引用
  • 非静态方法的方法引用
  • 构造函数的方法引用

方法引用Demo:

public class Demo {
    public static void main(String[] args) {
        // 静态方法引用--通过类名调用
        Consumer<String> consumerStatic = Java3y::MyNameStatic;
        consumerStatic.accept("3y---static");

        //实例方法引用--通过实例调用
        Java3y java3y = new Java3y();
        Consumer<String> consumer = java3y::myName;
        consumer.accept("3y---instance");

        // 构造方法方法引用--无参数
        Supplier<Java3y> supplier = Java3y::new;
        System.out.println(supplier.get());
    }
}

class Java3y {
    // 静态方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 实例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Java3y() {
    }
}

结果如下:

结果

最后

Lambda虽然代码看起来是简洁,但是如果复杂的话还是比较难看明白的。

在学习Lambda的时候,首先我们得知道有哪些常用函数式编程接口,这些函数式编程接口的有什么区别(参数个数、返回值类型)

Lambda表达式返回的是接口对象实例,如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用来替代Lambda表达式

最后再完整举个例子:

// Supplier是一个无入参带返回的值的函数式编程接口

// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y(); 

// 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

觉得我的文章写得不错,点

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring Boot 基础教程:集成 Swagger2,构建强大的 API 文档
主要对 Swagger 进行了简单介绍,并用 Spring Boot 集成 Swagger,同时还进行简单的测试,构建我们自己的 API 接口文档。
8 0
看完这篇,你不可能不懂「动态代理」
四个版本迭代,带你一步步模拟JDK动态代理
6 0
系统稳定性设计原则:简单、冗余、标准化、健壮
系统稳定性设计原则:简单、冗余、标准化、健壮
5 0
Spring Boot 基础教程:使用 Swagger3 生成 API 接口文档
主要介绍如何使用 Spring Boot 集成 Swagger3,构建我们自己的 API 接口文档,并对比了 Swagger2 和 Swagger3 的区别,让我们从 Swagger2 向 Swagger3 过渡更加顺滑。
8 0
Spring Boot Serverless 实战系列 | 性能调优
Spring Boot Serverless 实战系列第四篇来啦,本文将向大家介绍如何对 Serverless 应用进行性能调优。
10 0
相约在冬季实战营——第一期学习报告
冬奥云小宝带你玩转五期实战营 覆盖五大技术方向 “0成本”实践学习 快速晋级为专业的“云上开发者” -- 摘自云起冬季实战营https://developer.aliyun.com/adc/series/wintercamp
19 0
漫谈“架构团队”之组织架构(下)
漫谈“架构团队”之组织架构(下)
6 0
Spring5入门学习笔记
这个是视频学习时记录的笔记,供自己日后复习和其他同学参考使用。
3 0
+关注
java3y
公众号:Java3y。文章导航:https://github.com/ZhongFuCheng3y
176
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载