最近学习到的Lambda表达式
前言
只有光头才能变强。
文本已收录至我的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接口来举例:
使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface
注解(标记着这个接口只有一个抽象方法)
1.1 函数式编程接口
从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值。
JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:
简单说明一下:
- 表格中的一元接口表示只有一个入参,二元接口表示有两个入参
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时,要记住的就两点:
- Lambda返回的是接口的实例对象
- 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口
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多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!
觉得我的文章写得不错,点赞!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java描述设计模式(13):迭代器模式
本文源码:GitHub·点这里 || GitEE·点这里 一、迭代器模式 1、基础概念 迭代器模式又叫游标模式,是对象的行为模式。迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。 2、模式图解 3、核心角色 Iterator:迭代器角色 此抽象角色定义出遍历元素所需的接口。 ConcreteIterator:具体迭代器角色 此角色实现了Iterator接口,并保持迭代过程中的游标位置。 Aggregate:聚集角色 此抽象角色给出创建迭代器(Iterator)对象的接口。 ConcreteAggregate:具体聚集角色 聚合持有对象集合,提供返回迭代器的方法,可以正确遍历该集合。 Client:客户端角色 持有对聚集及其迭代器对象的引用,调用迭代器对象的迭代接口。 4、源码案例 public class C02_Iterator { public static void main(String[] args) { Object[] objArray = {"one","two","three","four","five"}; Aggregate aggregate ...
- 下一篇
网站漏洞检测 apache nginx解析绕过上传漏洞
在日常对客户网站进行渗透测试服务的时候,我们SINE安全经常遇到客户网站,app存在文件上传功能,程序员在设计开发代码的过程中都会对上传的文件类型,格式,后缀名做安全效验与过滤判断,SINE安全工程师在对文件上传漏洞进行测试的时候,往往发现的网站漏洞都是由于服务器的环境漏洞导致的,像IIS,apache,nginx环境,都存在着可以导致任意文件上传的漏洞。 关于导致文件上传漏洞的产生以及测试,我们来详细的分析一下: IIS解析漏洞导致的任意文件上传 首先比较常见的是客户网站使用的IIS环境来搭建的,一般是IIS+PHP+Mysql数据库组合,或者IIS+aspx+sql2005数据库,IIS存在解析漏洞,当创建文件名为.php的时候,在这个目录下的所有文件,或者代码,都会以PHP脚本的权限去运行,比如其中一个客户网站,可以将上传的目录改为1.php,那么我们上传的jpg文件到这个目录下,访问的网址是域名/1.php/1.jpg从浏览器里访问这个地址,就会是php脚本的权限运行。当上传网站木马webshell过去,就会直接拿到网站的管理权限。存在IIS解析漏洞的版本是5.0-6.0版本。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果