本文翻译整理自:https://winterbe.com/posts/2015/03/05/fixing-java-8-stream-gotchas-with-intellij-idea

作者:@Winterbe

欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 《Java 核心知识整理&面试.pdf》资源链接!!

个人网站: https://exception.site/java8/java8-improve-stream-byidea-tips

小哈再次推荐一篇 @Winterbe 的译文,主要是讲如何通过 IntelliJ IDEA 来提升 Stream 的编码效率,算是一个小技巧,经常使用 Java8 Stream 流的小伙伴们,可以试下,能够提升工作效率哦!

PS: 在阅读本文前,建议您先阅读一下小哈的另一篇译文:《Java8 新特性 Stream 流教程》

目录

  • 一、Java8 Stream API 的不友好性

  • 二、借助 IntelliJ IDEA 来优化一下

    • 2.1 新建 Stream Live Templates
    • 2.2 顺手把其他常用的模板设置一下
  • 三、结语

一、Java8 Stream API 的不友好性

Java8 自 2014 年 3 月发布以来,已经过去很多个年头了。在我们公司内部,也已逐渐将所有的生产代码迁移到这个版本。迁移中,我们主要所做的工作就是,将代码库更新为 lambda 表达式,Steam 流和新的日期 API。另外,我们还使用 Nashorn 动态编写那些可能在运行时需要被更改的功能。

除了 lambda 表达式外,最常用的一个功能就是新的 Stream API 了,它可以被用来很方便地操作集合。此外,Stream 还可以很大的提高操作集合代码的可读性。

但是,关于 Stream 流, 有一件事真的让我很困扰!

在使用 Stream 流时,类似reducefindFirst这样的终端操作,语义都是简单明了,也很直接,我们无需再额外传参。

而另一类我们使用比较多的终端操作: collect 用起来就很繁琐了,如我们要转换成 List 的时候,我们的写法一般是这样的:.collect(Collectors.toList())

例如,下面这段代码对字符串集合进行过滤,并转成一个新的集合:

stringCollection
.stream()
.filter(e -> e.startsWith("a"))
.collect(Collectors.toList());

又比如,我们要转换成 Set 的时候,需要写成这样:.collect(Collectors.toSet()),还有 joininggroupingBy之类。

在我完成对 30 万行代码 steam流的迁移后,我总结了一下,toList, toSetgroupingBy 是我们项目目前最常用的终端操作。我无法理解 JDK 的设计者们为什么不对 collect 方法再简化一下,以让它更人性化一些,比如同样的一段代码,为什么不设计成下面这样:

stringCollection
.stream()
.filter(e -> e.startsWith("a"))
.toList();

因为没有设计成这样,导致我们在代码中不得不一遍又一遍地使用 Collectors.toXXX, 这就烦躁了。

二、借助 IntelliJ IDEA 来优化一下

IntelliJ IDEA 号称宇宙最智能 Java IDE, 看看我们如何通过它来解决这个愁人的问题。

IntelliJ IDEA 附带了一个名为 Live Templates(实时模板) 的便捷功能。这是个啥玩意?即使您还不知道它是什么, 但是你也一定经常使用到它。比如输入常用代码段的快捷方式 sout,IDEA 会插入代码段System.out.println()。又比如,输入 psvm, IDEA 会快速帮您生成 main 方法等。

PS: 阅读此处以了解有关它的更多信息。

哦,就这玩意?

那要怎么通过 Live Templates(实时模板) 来解决前面提到的痛点呢?

2.1 新建 Stream Live Templates

1.按步骤打开 File -> Setting -> Editor -> LiveTemplates

2.新建一个 Template Group , 取名为 Stream:

3.创建完成后,选中 Stream, 新建一个实时模板

4.创建一个 toList 代码片段模板:

注意:代码片段的上下文选 Java -> other.

5.设置完成后,让我们在实战中看下效果吧!

2.2 顺手把其他常用的模板设置一下

除了上面演示的 toList外, toSetgroupingByjoin使用也相当普遍,我们也来设置一下,方法与上面大同小异,这里就不一一贴图了,贴上代码片段内容:

// 缩略: .toList
.collect(Collectors.toList()); // 缩略: .toSet
.collect(Collectors.toSet()); // 缩略: .join
.collect(Collectors.joining("$END$")); // 缩略: .groupBy
.collect(Collectors.groupingBy(e -> $END$));

PS: 特殊变量$END$用来在代码片段生成后,确定光标位置,这样你就可以直接输入相关代码了,比如,定义 join 连接分隔符等。

模板都创建好了以后,截图如下:

最后,我们再来看看,joingroupBy 的使用效果图:

三、结语

IntelliJ IDEA 中的实时模板是个功能丰富且强大的工具。善用它,可以大大地提高咱们的编码效率哦。

免费分享 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心知识&面试.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

获取方式: 关注公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接,下面是目录以及部分截图:

重要的事情说两遍,关注公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接 !!!

欢迎关注微信公众号: 小哈学Java

如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率的更多相关文章

  1. Java8 Stream性能如何及评测工具推荐

    作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java8的Stream就是兼具两者的知识.不学看不懂,学了写起代码来如虎添翼. 在上篇<Java8 Stre ...

  2. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  3. 【转】Java8 Stream 流详解

      当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是 ...

  4. Java8 Stream 的最佳实践

    Java8 Stream 的最佳实践 java8stream提供了对于集合类的流失处理,其具有以下特点: Lazy Evaluation(长度可以无限) 只能使用一次 内部迭代 Lazy Evalua ...

  5. java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)

    当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...

  6. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  7. 简洁又快速地处理集合——Java8 Stream(下)

    上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...

  8. 简洁又快速地处理集合——Java8 Stream(上)

    Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的改变可以说是革命性的,影响足够深远,学习 Java 8 应该是 Java 开发者的必修课. 今天 ...

  9. 如何用Java8 Stream API找到心仪的女朋友

    传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...

随机推荐

  1. Spark实现分组TopN

    一.概述 在许多数据中,都存在类别的数据,在一些功能中需要根据类别分别获取前几或后几的数据,用于数据可视化或异常数据预警.在这种情况下,实现分组TopN就显得非常重要了,因此,使用了Spark聚合函数 ...

  2. OSI、TCP/IP

    计算机网络分层的目的:支持异构网络系统的互联互通 7层OSI参考模型是法定标准(国际标准化组织ISO提出) 4层TCP/IP参考模型是事实标准 OSI参考模型 应用层.表示层.会话层.传输层.网络层. ...

  3. mysql--日志文件

    1 选择常规查询日志和慢查询日志输出目标 1.1  log_output查看.定义 所谓的输出目标就是日志写入到哪里,mysql中用系统变量 log_output来指定输出目标,log_output的 ...

  4. Linux服务管理之ntp

    NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要 ...

  5. nfs—文件转换器

    前端时间,在做一次设备升级时对nfs有了新的认识. nfs一般认为是文件共享服务器,但在实际的工作环境中,业务服务器有诸多限制,需要有加密隔离措施等等,版本升级和功能调试不同于平时的实验环境. 特别好 ...

  6. 性能测试基础---jmeter二次开发

    ·Jmeter的二次开发,常见的有以下几种类型: ·扩展.修改Jmeter已有的组件(源代码) ·扩展.修改Jmeter已有的函数. ·完全自主开发一个新的组件(依赖于Jmeter提供的框架). ·扩 ...

  7. 09-赵志勇机器学习-k-means

    (草稿) k-means: 1. 随机选取n个中心 2. 计算每个点到各个中心的距离 3. 距离小于阈值的归成一类. 4. 计算新类的质心,作为下一次循环的n个中心 5. 直到新类的质心和对应本次循环 ...

  8. JanusGraph入门,schema及数据模型

    5.Schema和数据建模 每个JanusGraph都有一个schema,该schema由edge labels,property keys,和vertex组成.JanusGraph schema可以 ...

  9. ZJOI2019赛季回顾

    退役了. NOIP2018 day1没什么好说的. day2开考后看完题:这个T3 TM不是DDP吗? 考前刚学过这东西,还没去写过 当时不知道在想什么,胡了T1 60和T2 50分保底之后就去刚T3 ...

  10. Gym - 102056C(2018EC final) -Heretical … Möbius ——CRT

    题意 给出一个长为200的01序列,判断是否在前1e9个莫比乌斯*值中.(这里的莫比乌斯值加了绝对值) 分析 意到因为4的倍数一定是0,9的倍数一定是0……169的倍数一定是0.那么我们可以对4,9, ...