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

作者 |  Java3y
责编 | 阿秃
前言
只有光头才能变强。
学了一下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开发者社区的意见领袖、微服务架构先驱Chris Richardson亲笔撰写,微服务实用落地指南。

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

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

译者:喻勇

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

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

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

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


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

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

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

推荐阅读:

  • 【角度刁钻】如果把线程当作一个人来对待,秒懂
  • 华为表示年内没有推出搭载鸿蒙操作系统手机的计划;OpenStack或被抛弃?iPhone至少还要三年可苹果自研5G调制解调器……
  • 多模态人物识别技术及其在视频场景中的应用 | CSDN技术公开课

  • Python可视化解析MCMC
  • 40 岁编程经验 30 年!支付宝资深工程师的程序人生

  • 你是程序员小白 Or 大神?一图见分晓!
  • 5个理由告诉你, 区块链未必适合你的业务!
真香,朕在看了!

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

  1. 100张图训练1小时,照片风格随意变,文末有Demo试玩|SIGGRAPH 2021

    照片变画像,现在已经有了最新的技术. 正常的人物照片: 可以自动变成卡通电影里的角色,眼睛大大的.皮肤看上去滑滑的,还保留了不少原本的人物特征: 也可以变成武侠游戏风格,女生下巴尖尖,男生头发飘逸,仿 ...

  2. 其实你也可以做出一个抖音(文末实战项目分享)

    好久不联系的朋友,我不知道要用什么理由关心你的生活,我不知道要用什么借口让你能听一听我诉的苦水,我怀念当初的日子,即使我知道生活总是往前.或许我很久没有联系你了,不要觉得我无情,不要觉得我喜新,不要觉 ...

  3. H5微信分享踩坑大全--文末有微信分享代码大全

    1.第一个坑就是请求接口的时候不能直接请求接口,需要把当前的接口处理一下,最好是用get请求, 2. 第二就是要把这的字段名字要跟后台返回的一致(我就是应为这个问题,弄得一直报签名错误)注意大小写问题 ...

  4. 深入分布式缓存之EVCache探秘开局篇(文末赠书)

    深入分布式缓存 读完需要 15 分钟 速读仅需 5 分钟 云服务不仅为软件系统的开发和部署带来了更多的敏捷性,而且提供了更多创新的可能性.当分布式缓存技术遇到云服务会是怎样的情形呢?EVCache 就 ...

  5. 神武手游创建人物等待服务器响应,神武2手游成长全流程变强必经之路 人物增强篇...

    很多玩家刚开始接触神武2这款游戏的时候都不知道人物怎么才能变强,本期18183小编就给大家带来了人物变强的技巧攻略,一起来看看吧! 三种升级方式: 1:突破,就是比服务器等级升的更快,这个适合时间流玩 ...

  6. lambda表达式图解-一图胜百文

    1.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值".    如果你想把"一块代码"赋给一个Java变量,应该怎么做呢?  比如, ...

  7. 电脑神器推荐 地表最强播放器 (文末附下载资源)

    文章目录 一款你值得拥有的播放器potplayer 推荐理由 个人常用功能 最后 安装包 一款你值得拥有的播放器potplayer 推荐理由 对于各类职业的你来说,它真的值得你拥有 兼容性强,可支持市 ...

  8. 2019 让自己变的更加优秀(文末新年福利)

    回顾2018 时间真的很快,今天是新年第 2 天,在过去的一年中我的宝贝女儿诞生了,她带给我满满的喜悦:在过去的一年里我 2 年前买的房子按时交房,并于年底前装完:在过去的一年里 我完成了 40 多篇 ...

  9. 架构师们,怎么走着走着就变“烟囱”了呢? | 文末含福利

    作者 | 耿立超 来源 | <大数据平台架构与原型实现:数据中台建设实战> * 文末有福利 这两年,随着中台概念的兴起,一种IT过去的常态,现在的明星反面教材--"烟囱式架构&q ...

最新文章

  1. Linux网络编程必看书籍推荐
  2. c# BinaryFormatter 更换了命名空间反序列化遇到的问题
  3. 博为峰JavaEE技术文章 ——MyBatis 注解
  4. java同名类_java两个不同名类 在里面建立两个同名的类 怎么破
  5. pythonjson数据提取_python爬虫学习笔记(十)-数据提取之JsonPath的使用
  6. Codeforces Round #643 (Div. 2)(A, B, C, D, E)
  7. Windows11 Docker镜像存储路径更改(非C盘路径)
  8. Go 语言学习总结(5)—— Go 学习笔记总结
  9. 独立站卖家不可缺的推广引流?
  10. BigNums 之 hdu 1753
  11. SQL Where子句
  12. 如何在Scala中使用条件表达式
  13. centos php mbstring.so,CentOS安装php mbstring的扩展
  14. Tomcat角色说明及配置
  15. postgres 禁止远程登录_Postgresql允许远程访问配置修改
  16. 麦普奇医疗获得千万元A轮融资,投资方为达晨财智...
  17. word2016论文不同章节设置页眉页码方法
  18. python myqr制作二维码生成器_用Python生成动态二维码,只要5行代码,拥有你的个性二维码!...
  19. JavaScript原型是什么
  20. 支持GIF动画的ImageView

热门文章

  1. python bottle部署g_python bottle框架(WEB开发、运维开发)教程 | linux系统运维
  2. mysql 语句 集锦_mysql 语句集锦
  3. linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别
  4. python如何读取数据时出现错误_连接数据库时出现的错误,怎样解决??
  5. 博士生想逃离科研,导师还要帮他吗?|Nature专访
  6. 《自然》发布2022年值得关注的七大科学事件!
  7. 原来数学才是世界上最浪漫的学科!
  8. 北大教授最短毕业致辞。#人性的可爱 #饶毅#自我尊重
  9. 刚刚,三位科学家获得2019年诺贝尔物理学奖!
  10. 西南石油大学硕导携研究生野外考察遭遇泥石流,师生4人不幸遇难