你还在使用JDK7,今天阿粉带你来了解一下JDK8,不得不说,真香!
前几天阿粉还在和同事抱怨,说现在 JDK 都已经11,12了,结果自己还在用 JDK 7,于是就发生了下面一幕。
阿粉:老宫阿(宫保鸡丁),你说现在 JDK 都已经出到11了,你说对咱们是不是太不友好了,我都快学不动了。老宫:先别说出到几了,你们现在开发用的是啥?阿粉:我们还是用的7呀!老宫:你竟然还在用7,那你知道什么是 Lambda 么?阿粉:Lambda?听过,但是没用过呀,但是据说挺好用的,但是我觉得学起来好麻烦,我想静静!老宫:你是不知道呀,JDK8 里面可不仅仅是 Lambda,还有好多新特性呢!
于是故事开始了,在老宫(宫保鸡丁)的讲述下,阿粉也不得不重视起来了,阿粉也要开始学习 JDK8 了,不然再往后,都直接被淘汰了!
1. Java8 核心新特性讲解
Java 8的核心新特性:Lambda(匿名函数)、流、默认方法。
自1998年JDK 1.0(Java 1.0)发布以来,Java已经受到了学生、项目经理和程序员等一大 批活跃用户的欢迎。你看从学生,到项目经理,到程序员,这么多的角色都对 Java 情有独钟,看来不学是真的不行了。
Java 8对硬件也有影响:平常我们用的 CPU 都是多核的——你的笔记本电脑或台式机上的处理器可能有四个 CPU 内核,甚至更多。但是,绝大多数现有的 Java 程序都只使用其中一个内核,其他三个都闲着,或只是用一小部分的处理能力来运行操作系统或杀毒程序。在Java 8之前,专家们可能会告诉你,必须利用线程才能使用多个内核。问题是,线程用 起来很难,也容易出现错误。
从 Java 的演变路径来看,它一直致力于让并发编程更容易、 出错更少。Java 1.0里有线程和锁,甚至有一个内存模型——这是当时的最佳做法,但事实证明,不具备专门知识的项目团队很难可靠地使用这些基本模型。Java 5添加了工业级 的构建模块,如线程池和并发集合。Java 7添加了分支/合并(fork/join)框架,使得并行 变得更实用,但仍然很困难。
而Java 8对并行有了一个更简单的新思路,不过你仍要遵循一些规则,这些规则阿粉会在后边给大家讲。
2. Lambda表达式
2.1 什么是Lambda表达式
阿粉在研究 Java 8的时候第一件事就是研究的 Lambda 表达式是怎么书写的。
Lambda表达式是带有参数变量的表达式,是一段可以传递的代码,可以被一次或多次执行,是一种精简的字面写法,其实就是把匿名内部类中“一定”要做的工作省略掉,然后由JVM通过推导把简化的表达式还原。
先给大家来个传统排序。
排序结果:
阿粉再来带大家来看看使用 Lambda 表达式的方式:
其实这是 Lambda 表达式的简单的使用,Lambda表达式里面还有很多应用。比如说使用 Lambda表达式来实现多线程。
public class TestClass {public static void main(String[] args) {new Thread(()-> {for(int i=0;i<20;i++) {System.out.println("阿粉最帅");}}).start();}
}
其实你看到上面的 Lambda表达式 是不是感觉很简单,但是简单是简单,阿粉要问大家一个问题了?大家什么时候才适合使用 Lambda表达式呢?
2.2 什么时候使用 Lambda表达式
需要显示创建函数式接口对象的地方,都可以使用
实际上函数式接口的转换是Lambda表达式唯一能做的事情
用于替换以前广泛使用的内部匿名类,各种回调
3. 使用函数式接口
函数式接口定义且只定义了一个抽象方法。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。函数式接口的抽象方法的签名 称为函数描述符。所以为了应用不同的Lambda表达式,你需要一套能够描述常见函数描 述符的函数式接口。Java API中已经有了几个函数式接口,比如说 Comparable、Runnable和Callable。
Predicate
@FunctionalInterface
public interface Predicate {boolean test(T t);
}public static List filter(List list, Predicate p) {List results = new ArrayList<>();for (T s : list) {if (p.test(s)) {results.add(s);}}return results;}Predicate nonEmptyStringPredicate = (String s) -> !s.isEmpty();List nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);
java.util.function.Predicate
接口定义了一个名叫test的抽象方法,它接受泛 型T对象,并返回一个boolean。现在就可以直接使用了。在我们需要表示一个涉及类型T的布尔表达式时,就可以使用这个接口。
Consumer
public static void forEach(List list, Consumer c) {for (T i : list) {c.accept(i);}}forEach(Arrays.asList(1,2,3,4,5), (Integer i)->System.out.println(i) ←─Lambda是Consumer中accept方法的实现 );
java.util.function.Consumer定义了一个名叫accept的抽象方法,它接受泛型T 的对象,没有返回(void)。你如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个接口。比如,你可以用它来创建一个forEach方法,接受一个Integers的列 表,并对其中每个元素执行操作。在上面的代码中,你就可以使用这个forEach方法,并配合Lambda来打印列表中的所有元素。
至于剩下的 Function 阿粉就不给大家说了。
Java 8中的常用的函数式接口
今天阿粉就先给大家说这些关于 Java8 的特性,阿粉在接下来的文章中会继续讲述 Java8 的新特性呦。
精彩回顾:
记一次线上 OOM 和性能优化
MyBatis 的 DAO 接口跟 XML 文件里面的 SQL 是如何建立关系的?
Gateway:数据报文走出局域网的必经之路
一文带你了解 Redis 的发布与订阅的底层原理
你还在使用JDK7,今天阿粉带你来了解一下JDK8,不得不说,真香!相关推荐
- 还在服务器上捞日志?试试这款可视化监控系统吧,真香!
因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 点击关注#互联网架构师公众号,领取架构师全套资料 都在这里 0.2T架构师学习资料干货分 ...
- 文艺复兴?诺基亚再推翻盖手机 28天待机 仅售700元还带4G 真香就完事了!
诺基亚作为曾经的全球手机霸主,因为在智能机普及时代的一系列失误的决策,全球手机市场份额急剧下滑,随后卖身微软想要靠着微软的WP系统东山再起,奈何微软不给力,没能挽回诺基亚一去不回的颓势,与微软分开后, ...
- 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告
Alex 发自 凹非寺 量子位 | 公众号 QbitAI 现在,M1 Mac可以顺利运行原生Linux了. 专为苹果自研芯片打造的Asahi Linux项目,Alpha版本已经释出. 在Mac采用英特 ...
- 还在网上找Demo?这个Java项目真香!
我前几天专门去网上搜集项目,打算找一些分享给大家用来实践. 但找了一圈发现,网上的项目都比较旧,业务也有些过时,再有就是一些特别大型的项目,不适合初学者做. 不过,我最终还是发现了1个免费的Java训 ...
- 英国首相用华为P20 Pro自拍引热议,网友:真香,比炸鱼和薯条还香
近日,英国首相鲍里斯·约翰逊在参加英国电视台晨间节目"This Morning"时,与主持人使用华为手机自拍引起国外网友热议. 本来用华为自拍也无需大惊小怪,但有意思的是,约翰逊才 ...
- jdk13不能显示中文_JDK 13都发布了!你还在用JDK7吗?
就在昨天(2019年09月17日),JDK 13 已经处于 General Availability 状态,已经正式可用了.General Availability(简称 GA)是一种正式版本的命名, ...
- 微信好友太少?因为你还没掌握这些微信爆粉方法(下篇)
上期的如何爆粉课程发出后,很多站长的微信都增加了不少粉丝:为了更好的教大家如何微信爆粉,樱桃老师又出新课程了:微信好友怎么爆粉(下篇) 写文章 在一些专业论坛写文章,介绍自己对行业的理解.看法,或者分 ...
- 微信好友太少?因为你还没掌握这些微信爆粉方法!(上篇)
做小站站长,没有一定数量的微信好友,怎么提高转化?今天,挖到网樱桃老师来教大家如何让你的微信爆粉. 加熟人 第一种:将手机联系人转化为微信好友. 第二种:加目前已有群的好友,增加现有的用户基础. 加目 ...
- 阿粉带你解锁 DNS 协议
每天早上七点三十,准时推送干货 大家应该都知道,当我访问一个网址的时候,实际上我是在访问一个 IP 地址.那为什么不记 IP 地址,反而要去访问一个网站名字呢,比如谷歌. 阿粉想了想,现在有多少网站, ...
最新文章
- 解决binwalk运行提示缺少LZMA模块
- 攻破MySQL性能瓶颈必知的调优技巧
- Java入门算法(递归篇)丨蓄力计划
- LS 24 Bracket sequence(DP)
- 微信小程序,小游戏sockect报错修复集合
- 一个测试工程师面试官的真实分享!个人超赞同!
- 深入研究微服务架构——第一部分
- 推荐几个我珍藏的公众号~超级无敌!
- 线性表(插入/清除数据/快慢指针查找中间数据)
- 系统架构设计的十大原则
- 文件夹重命名导致软件图标不显示问题解决
- Docker常用命令(基础)
- Ackerman阿克曼(单舵轮)前轮驱动并转向移动机器人的建模及控制算法
- 如何判断用户输入的邮箱格式是否正确?
- 中考考不上好高中怎么办?
- wpscan扫描的简单介绍(对WordPress的扫描CMS)
- The application was unable to start correctly (0xc000007b)的勉强解决方案
- mysql_java.sql.SQLException: null, message from server: Host 'xxx' is not allowed to connect
- Android中Alarm的机制
- Windows 上 安装Postgres 及pgAdmin4的基本使用