前几天阿粉还在和同事抱怨,说现在 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,不得不说,真香!相关推荐

  1. 还在服务器上捞日志?试试这款可视化监控系统吧,真香!

    因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 点击关注#互联网架构师公众号,领取架构师全套资料 都在这里 0.2T架构师学习资料干货分 ...

  2. 文艺复兴?诺基亚再推翻盖手机 28天待机 仅售700元还带4G 真香就完事了!

    诺基亚作为曾经的全球手机霸主,因为在智能机普及时代的一系列失误的决策,全球手机市场份额急剧下滑,随后卖身微软想要靠着微软的WP系统东山再起,奈何微软不给力,没能挽回诺基亚一去不回的颓势,与微软分开后, ...

  3. 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告

    Alex 发自 凹非寺 量子位 | 公众号 QbitAI 现在,M1 Mac可以顺利运行原生Linux了. 专为苹果自研芯片打造的Asahi Linux项目,Alpha版本已经释出. 在Mac采用英特 ...

  4. 还在网上找Demo?这个Java项目真香!

    我前几天专门去网上搜集项目,打算找一些分享给大家用来实践. 但找了一圈发现,网上的项目都比较旧,业务也有些过时,再有就是一些特别大型的项目,不适合初学者做. 不过,我最终还是发现了1个免费的Java训 ...

  5. 英国首相用华为P20 Pro自拍引热议,网友:真香,比炸鱼和薯条还香

    近日,英国首相鲍里斯·约翰逊在参加英国电视台晨间节目"This Morning"时,与主持人使用华为手机自拍引起国外网友热议. 本来用华为自拍也无需大惊小怪,但有意思的是,约翰逊才 ...

  6. jdk13不能显示中文_JDK 13都发布了!你还在用JDK7吗?

    就在昨天(2019年09月17日),JDK 13 已经处于 General Availability 状态,已经正式可用了.General Availability(简称 GA)是一种正式版本的命名, ...

  7. 微信好友太少?因为你还没掌握这些微信爆粉方法(下篇)

    上期的如何爆粉课程发出后,很多站长的微信都增加了不少粉丝:为了更好的教大家如何微信爆粉,樱桃老师又出新课程了:微信好友怎么爆粉(下篇) 写文章 在一些专业论坛写文章,介绍自己对行业的理解.看法,或者分 ...

  8. 微信好友太少?因为你还没掌握这些微信爆粉方法!(上篇)

    做小站站长,没有一定数量的微信好友,怎么提高转化?今天,挖到网樱桃老师来教大家如何让你的微信爆粉. 加熟人 第一种:将手机联系人转化为微信好友. 第二种:加目前已有群的好友,增加现有的用户基础. 加目 ...

  9. 阿粉带你解锁 DNS 协议

    每天早上七点三十,准时推送干货 大家应该都知道,当我访问一个网址的时候,实际上我是在访问一个 IP 地址.那为什么不记 IP 地址,反而要去访问一个网站名字呢,比如谷歌. 阿粉想了想,现在有多少网站, ...

最新文章

  1. 解决binwalk运行提示缺少LZMA模块
  2. 攻破MySQL性能瓶颈必知的调优技巧
  3. Java入门算法(递归篇)丨蓄力计划
  4. LS 24 Bracket sequence(DP)
  5. 微信小程序,小游戏sockect报错修复集合
  6. 一个测试工程师面试官的真实分享!个人超赞同!
  7. 深入研究微服务架构——第一部分
  8. 推荐几个我珍藏的公众号~超级无敌!
  9. 线性表(插入/清除数据/快慢指针查找中间数据)
  10. 系统架构设计的十大原则
  11. 文件夹重命名导致软件图标不显示问题解决
  12. Docker常用命令(基础)
  13. Ackerman阿克曼(单舵轮)前轮驱动并转向移动机器人的建模及控制算法
  14. 如何判断用户输入的邮箱格式是否正确?
  15. 中考考不上好高中怎么办?
  16. wpscan扫描的简单介绍(对WordPress的扫描CMS)
  17. The application was unable to start correctly (0xc000007b)的勉强解决方案
  18. mysql_java.sql.SQLException: null, message from server: Host 'xxx' is not allowed to connect
  19. Android中Alarm的机制
  20. Windows 上 安装Postgres 及pgAdmin4的基本使用

热门文章

  1. 魔兽世界中的英文简写
  2. KEYSIGHT示波器 MSO-X 3024A 简单操作说明
  3. 2013年部分节假日安排
  4. 人体分析Demo-百度API
  5. 如果有人能力不如你工资比你高怎么看?
  6. 未能找到路径“\bin\roslyn\csc.exe”的一部分 的解决办法
  7. Android -- 购物车
  8. 过滤器,监听器,拦截器的区别
  9. 从底层结构开始学习FPGA(5)----移位寄存器
  10. FISCO BCOS群组特性