【只有光头才能变强,文末有xx】分享一波Lambda表达式

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg
作者 |  Java3y
责编 | 阿秃

前言
只有光头才能变强。

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

一、Lambda用法


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

640?wx_fmt=png


以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表达式,实际就是创建出该接口的实例对象。

640?wx_fmt=png
返回一个Runnable对象实例

图示,Runnable接口来举例:

640?wx_fmt=png
以Runnable接口为例

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

640?wx_fmt=png

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


1.1 函数式编程接口


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

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

640?wx_fmt=png
常用的函数式编程接口

简单说明一下:

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

    640?wx_fmt=png
    以BiFunction为例

    640?wx_fmt=png

    常用的函数式接口

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表达式又简洁了一些。

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

640?wx_fmt=png

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

方法引用又分了几种:

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

方法引用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() { }}

结果如下:

640?wx_fmt=png
结果

最后


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

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

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

最后再完整举个例子:
 
  
// Supplier是一个无入参带返回的值的函数式编程接口
// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值Supplier<Java3y> supplier = () -> new Java3y();
// 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用Supplier<Java3y> supplier2 = Java3y::new;


【叮叮当叮叮当??? 送书时间到】


今天送?这本微服务架构设计模式


世界十大软件架构师之一、Java开发者社区的意见领袖、微服务架构先驱Chris Richardson亲笔撰写,微服务实用落地指南。

涵盖44个架构设计模式,系统解决服务拆分、事务管理、查询和跨服务通信等难题。易宝支付CTO陈斌、PolarisTech 联合创始人蔡书、才云科技CEO张鑫等多位专家鼎力推荐。


640?wx_fmt=png

 

作者:[美]克里斯·理查森(Chris Richardson)


译者:喻勇


【老规矩,获赞最多得】在本文留言并分享至朋友圈即可。

小伙伴们,你们真的好冷漠,仿佛阿秃我不曾让你们开心过一样!

艾瑞巴蒂ball ball u ,让我看到你们的热情~!

本次活动明日上午9点半over 么哇


 But,未获奖的读者也可以长按识别二维码购买。


640?wx_fmt=png


640?wx_fmt=png

640?wx_fmt=jpeg

??? 特邀各路大大免费入驻CSDN啦,除云计算 相关书籍免费赠送外, 还有海量福利奥~ 详情戳?下方图片 ,么么哒~


640?wx_fmt=png


福利
扫描添加小编微信,备注“ 姓名+公司职位 ”,入驻【CSDN博客】,加入【 云计算学习交流群 】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg

推荐阅读:

真香,朕在看了!
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值