专栏首页一猿小讲Java 8 的这些特性,你知道吗?

Java 8 的这些特性,你知道吗?

作为一个心怀大教堂之愿景的搬砖码农,伴着一行代码一块砖的节奏,生产环境上 JDK 的版本从 1.4 逐步升级到 8。

而 JDK 都到 14 啦,而多数程序员编写的代码依然停滞在 Java 6,而每当看到小鲜肉写的代码,到处都是 Lambda 表达式、流式操作 Stream API ... ...,着实很懵 B。

为了能跟小鲜肉看齐,老码农很有必要熟练一下 Java 8 的那些新特性啦。

1

函数式接口

如 Runnable 源码所示,接口中定义了唯一一个抽象方法 run,那么类似这种的接口,在 Java 8 中称之为函数式接口,是 Java 8 引入的一个核心概念。

仔细看 Runnable 的源码,会发现引入了一个新的注解:@FunctionalInterface,用来表示这个接口是一个函数式接口。

@FunctionalInterface 这个注解是非必须的,若接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

2

Lambda 表达式

Lambda 表达式是推动 Java 8 发布的最重要新特性,可以使用 Lambda 实例化函数式接口。

在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,而采用 Lambda 表达式则可以使代码变的更加简洁紧凑。

(图片来源于网络)

代码片段一:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("我是一个孤独的线程");
    }
});

上面代码是创建线程的代码片段,这种代码很常见,而采用 Lambda 表达式,则会很简洁。

new Thread(() -> System.out.println("我是一个孤独的线程"));

很显然,代码确实是简化了不少。代码是否能读懂?没关系,稍后做解释。

代码片段二:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("一个孤独的按钮被操作");
    }
});

上面的代码片段,是采用匿名内部类给按钮添加监听,而采用 Lambda 表达式,会是什么效果呢?

button.addActionListener((ActionEvent e) -> System.out.println("一个孤独的按钮被操作"));

哎呦,我去!妥妥的一行代码搞定,确实简化了不少。

烟味灭酒过半,是时候真正认识一下 Lambda 表达式啦。

Lambda 表达式

Lambda 表达式,由三个部分组成。

第一部分:为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数,例如代码片段二中的参数 ActionEvent e;

第二部分:为一个箭头符号:->;

第三部分:为方法体,可以是表达式和代码块。

具体语法如下:

(parameters) -> expression //当方法体为表达式时
或
(parameters) -> { statements; } //当方法体为代码块时

当方法体为表达式时,示例:

(int n1,int n2) -> return n1 + n2; //求和,该表达式的值作为返回值返回。

当方法体为代码块时,示例:

(String s) -> {System.out.println(s);} //打印,无返回值
(int a, int b) -> { return a * b; }; //大括号中的返回语句

Lambda 表达式的语法很简单,不过有些准则还是要提一提。

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。

那回头看看开篇提到的代码片段一、片段二,看完它们的简化过程,就很容易理解啦。

代码片段一,简化过程:

代码片段二,简化过程:

通过上面两段代码的简化过程,很显然使用 Lambda 表达式,可以很大程度上简化代码。

3

Stream:流式操作

Java 8 引入了流式操作(Stream),通过流式操作可以实现对集合的并行处理和函数式操作,想象成把要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

最重要的是:通过 Stream API 可以让程序员写出高效率、干净、简洁的代码。 Talk is cheap. Show me the code.

代码片段一:「filter」从集合中找出符合条件的数据。

List<String> names = Arrays.asList("一猿小讲","一猿小将","一员小讲");
// 统计名字列表中以 讲 结尾的个数
long count = names.stream().filter(name -> name.endsWith("讲")).count();

代码片段二:「forEach」对集合中的数据进行迭代。

List<String> names = Arrays.asList("一猿小讲","一猿小将","一员小讲");
// 统计名字以 讲 结尾的的名字,并进行迭代输出
names.stream().filter(name -> name.endsWith("讲")).forEach(name -> System.out.println(name));

代码片段三:「findAny」 vs「findFirst」。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲");
// findAny 从列表中任意找出一个符合条件的数据
Optional<String> any = names.stream().filter(name -> name.endsWith("讲")).findAny();
// findFirst 从列表中找出第一个符合条件的数据
Optional<String> first = names.stream().filter(name -> name.endsWith("讲")).findFirst();

代码片段四:「sorted」对流进行排序。

List<String> names = Arrays.asList(" 8888 ", " 6666 ", " 9999 ");
// 按照默认排序规则进行排序,当然可以自定义排序规则
names.stream().sorted().forEach(name -> System.out.print(name));
// 输出:6666  8888  9999

代码片段五:「distinct」去除重复元素。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 去除重复元素,并迭代输出
names.stream().distinct().forEach(name -> System.out.println(name));

代码片段六:「limit」获取指定数量的流。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 获取 2 条数据,并迭代输出
names.stream().limit(2).forEach(name -> System.out.println(name));

代码片段七:「map」映射每个元素对应的结果。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 针对每个姓名进行追加 @NB
names.stream().map(name -> name + "@NB").forEach(name -> System.out.println(name));

还有很多 Stream 的 API,不再一一举例,用法套路都差不多,其实是一个熟能生巧的过程。

4

寄语写最后

本次,主要对 Java 8 中引入的部分新特性,进行初步的讲解。若想要快速投入实战,还要靠各位下去结合本文的代码片段进行多写、多悟,写着写着就有感觉啦,油从钱孔入而钱不湿唯手熟而已。

好了,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

参考链接:

https://www.runoob.com/java/java8-streams.html

https://www.runoob.com/java/java8-lambda-expressions.html

https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/

本文分享自微信公众号 - 一猿小讲(yiyuanxiaojiangV5),作者:一猿小讲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 7 的那些“新”特性,你知道吗

    2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事。有不少同学都担心 Java ...

    沉默王二
  • Java这些冷知识你知道吗?

    1)jvm有很多种,其实jvm是一个标准,sun做的那个叫hotspot,作者就是后来v8的作者lars bak,其他公司也做过jvm,其中做得比较好的有bea...

    Java团长
  • Java这些冷知识你知道吗?

    1)jvm有很多种,其实jvm是一个标准,sun做的那个叫hotspot,作者就是后来v8的作者lars bak,其他公司也做过jvm,其中做得比较好的有bea...

    Java后端工程师
  • Java 8的这个新特性,你用了吗?

    今天写的一个方法,如下,实现的功能就是将数据库中的表字段获取,存在map 中,将前端传过来的数据存在map 中。

    程序员爱酸奶
  • Servlet3.0新特性:这些你都知道么??

    本文是 springboot 系列第 1 篇,平常我们用 springboot 最多的场景是开发 web 项目,而 springboot 中开发 web 用的是...

    路人甲Java
  • HTML5的这些api你知道吗?

    以下是之前学习的一些HTML5 API的总结,在HTML5中有许多功能和接口很值得我们去了解和学习。 页面可见性API--page Visbility 全屏...

    IMWeb前端团队
  • HTML5的这些api你知道吗?

    该API可以用来检测页面对于用户的可见性,即返回用户当前浏览的页面或标签tap的状态变化。 在最小化浏览器、切换tap页面时生效.(如需对app中几个webvi...

    IMWeb前端团队
  • PHP8.x 你必须知道的这些新特性

    Hello 大家好,我是CrazyCodes,距离上次发文已经过去4个月的时间,今年是悲惨的一年,也是奋发的一年,我会发布一些更好更实用的文章与大家分享,谢谢大...

    CrazyCodes
  • Java 中关于 Null 的这些事儿你知道吗

    对于 Java 程序员来说,null 一直是令人头疼的问题,经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个...

    cxuan
  • 你知道Java 8 的方法引用吗

    Java中的方法引用,很多同学都见过但却叫不出名字甚至不太会用,在这篇文章中,我们将看到什么是方法引用以及如何使用它。

    码农小胖哥
  • 这些HTML标签你知道吗?

    包含有序列表 <ol></ol> and 无序列表 <ul></ul>,列表项由<li></li>显示,其中有序列表的列表项以数字开头,无序列表的列表项...

    佛系编程人
  • PyTorch 的这些更新,你都知道吗?

    昱良
  • 这些Java9新特性,你用过吗?

    虽然Java已经出到14了,但是大部分公司用的依然是Java8,用的不是Java8的小伙伴请举手。Java8大家应该都很熟悉了。

    公众号 IT老哥
  • 关于 MVVM和MVC的这些,你知道吗?

    晚上练完车之后,之前参考我毕设的一个小伙伴要答辩,问了我一个问题,结果问的一下不知道怎么回答…以下是我回答他问题的答案:所以在回答完他之后,赶快整理一波…

    玖柒的小窝
  • @Autowired的这些骚操作,你都知道吗?

    最近review别人代码的时候,看到了一些@Autowired不一样的用法,觉得有些意思,特定花时间研究了一下,收获了不少东西,现在分享给大家。

    Bug开发工程师
  • 你知道这 8 种 SQL 错误用法吗?

    作者:db匠;链接:developer.aliyun.com/article/72501

    cxuan
  • 经常用Redis,这些坑你知道吗?

    作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历。

    用户7927337
  • 这些Android系统样式中的颜色属性你知道吗?

    推荐阅读看完后彻底搞清楚Android中的 Attr 、 Style 、Theme

    开发者
  • 你知道MySQL 8.0中的索引有哪些新特性吗?看这一篇就够了!!!

    在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索引删错了,又只能通过创建索引的方式将删除的索引添加回来,如果数据库中的数据量非常大,或者表...

    冰河

扫码关注云+社区

领取腾讯云代金券