如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率
本文翻译整理自: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 流时,类似reduce
和findFirst
这样的终端操作,语义都是简单明了,也很直接,我们无需再额外传参。
而另一类我们使用比较多的终端操作: collect
用起来就很繁琐了,如我们要转换成 List
的时候,我们的写法一般是这样的:.collect(Collectors.toList())
。
例如,下面这段代码对字符串集合进行过滤,并转成一个新的集合:
stringCollection
.stream()
.filter(e -> e.startsWith("a"))
.collect(Collectors.toList());
又比如,我们要转换成 Set
的时候,需要写成这样:.collect(Collectors.toSet())
,还有 joining
和 groupingBy
之类。
在我完成对 30 万行代码 steam
流的迁移后,我总结了一下,toList
, toSet
和 groupingBy
是我们项目目前最常用的终端操作。我无法理解 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
外, toSet
,groupingBy
和join
使用也相当普遍,我们也来设置一下,方法与上面大同小异,这里就不一一贴图了,贴上代码片段内容:
// 缩略: .toList
.collect(Collectors.toList());
// 缩略: .toSet
.collect(Collectors.toSet());
// 缩略: .join
.collect(Collectors.joining("$END$"));
// 缩略: .groupBy
.collect(Collectors.groupingBy(e -> $END$));
PS: 特殊变量
$END$
用来在代码片段生成后,确定光标位置,这样你就可以直接输入相关代码了,比如,定义join
连接分隔符等。
模板都创建好了以后,截图如下:
最后,我们再来看看,join
和 groupBy
的使用效果图:
三、结语
IntelliJ IDEA 中的实时模板是个功能丰富且强大的工具。善用它,可以大大地提高咱们的编码效率哦。
免费分享 | 面试&学习福利资源
最近在网上发现一个不错的 PDF 资源《Java 核心知识&面试.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!
获取方式: 关注公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接,下面是目录以及部分截图:
重要的事情说两遍,关注公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接 !!!
欢迎关注微信公众号: 小哈学Java
如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率的更多相关文章
- Java8 Stream性能如何及评测工具推荐
作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java8的Stream就是兼具两者的知识.不学看不懂,学了写起代码来如虎添翼. 在上篇<Java8 Stre ...
- Java8 Stream新特性详解及实战
Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...
- 【转】Java8 Stream 流详解
当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是 ...
- Java8 Stream 的最佳实践
Java8 Stream 的最佳实践 java8stream提供了对于集合类的流失处理,其具有以下特点: Lazy Evaluation(长度可以无限) 只能使用一次 内部迭代 Lazy Evalua ...
- java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)
当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...
- java8 Stream的实现原理 (从零开始实现一个stream流)
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- 简洁又快速地处理集合——Java8 Stream(下)
上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...
- 简洁又快速地处理集合——Java8 Stream(上)
Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的改变可以说是革命性的,影响足够深远,学习 Java 8 应该是 Java 开发者的必修课. 今天 ...
- 如何用Java8 Stream API找到心仪的女朋友
传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...
随机推荐
- GeoIP的使用-C语言版
0x00. 简介 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲.经纬度.国家.省市.ASN 等信息. GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本 ...
- Linux Firewalld 基础实例
本次是一个Firewalld的基础操作实例,利用Firewalld图形操作界面进行访问控制操作. 实验拓扑 需求分析 首先拓扑涉及到两个区域,这里使用work和public区域,分别做相应的规则. 1 ...
- JavaScript中eval函数的用法
1. eval函数会计算传给的字符串, 并把作为脚本代码来执行. eval(str) 此函数接受一个字符串作为参数,并把str当做一段JavaScript脚本代码来执行,如果str执行结果返回一个值则 ...
- linux增加swap空间的方法小结
起因及背景 近期编译AOSP(android 10.0)是总是遇到内存溢出,查了半天,无果.猜测增加下swap空间大小是否能解决,随即尝试下,果然是如此. 当然,还有其他作法,比如直接增加主机的内存( ...
- 模型选择---KFold,StratifiedKFold k折交叉切分
StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...
- qr.h
创建二维码 QRCodeCreate vc++
- vs2008 新建win32控制台程序提示:脚本错误
解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...
- git常用命令(测试必备)
什么是git 百度百科:Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. git相对svn,有很多优势,这里就不再赘述,大家网上搜索吧. g ...
- hdu6222——佩尔方程&&大数__int128
题意 给定一个整数 $N$($1 \leq N \leq 10^{30}$),求最小的整数 $t$,要求 $t \geq N$,使得边长为 $t-1, t, t+1$ 的三角形面积为整数. 分析 根据 ...
- Rpm Creating Subpackages
转自:http://ftp.rpm.org/max-rpm/s1-rpm-subpack-spec-file-changes.html Spec File Changes For Subpackage ...