太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

自从Java8在2014年三月发布,距离现在(2020年6月7号)} 8 K H 9快有6年了。我们打算将Pondus的所有生产服务器升级到这一新版本。从那时起,我们将大部6 C Y # z { ; J分代码库迁移到lambda表达式、数据流和新的日期API上。我们也会使用Nashorn来把我们的应用中运行时发生改变的部分变成动态脚本。

除了lambd D 5 3a,最实用的特性是新的数据流API。集合操作在任何我见过的代码库中都随处可见。而且对于那些集合操作,数据流是提升! , x 8 t ; v B代码可读性的好方法。

但是一件关于数据流的事情十分令我困扰:数据= x ( ,流只提供了几个终止操作,例如reduce和fin+ M $ SdFirst属于直接操作,其它的只能通过collect来访问。工具类Collctors提供了一些便利的收集器,例如toList、toSet、t W d u Cjoining和gro) V # J W d c @upingBy。

例如,下面的代码对一个字符串集合进行过滤,并创建新的列表:

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

在迁移了300k行代码到数据流之后,我可以说,toList、toSet、和groupingBy是你的项目中。所以我不能理解为什么不把这些方法直接集成到Stre! 8 , a x 8am接口上面,这样你就可以直接编 L ! ~ .写:

stringCollection
.stream()h j Q + ? 
.filter(l k 5 K _eV u ; U 8 N ? 7 B -> e.startsWith("a"))
.toList();

这在开始看起来是个小缺陷,但是如果你需要一遍又一遍地编写这些代码,它会非常烦人。

有toArray()方法但是没有toList(),所以我真心希望一些便利的收集器可以在Java9中这样添加到Str2 C u U 7 6eam接口中。是吧,Brian?ಠ_ಠ

注:Stream.js是浏览器上的Java 8 数据流API的JavaScript接口,并解决了上述问题。所有重要的终止操作都可以直接在流上访问,十分方便。详情请见API文档。

无论如何- h + `,Intel7 n p h Z 4 ` 8li3 + Z 3 !J IDEA声称它是最智能的Java I& C VDE。所以让我们看看如何使用IDEA来解决这一问题。

使用 IntelliJ IDEA 来帮忙

IntelliJ IDEA自带了一个便利的特性,叫做实时模板(Live Template)。如果你( = R U 3 m W还不知道它是什么:实时模板是一些常用代码段的快捷方式。例如,你键入sout并按下TAB键,IDEA就会插入代V r | w [ d M v码段System.out.println()。更多信息请见这里(https://www.jetbrains.com/help/idea/using-live-templates.html)。

如何用实时模板来解决上述问题?实际上我们只需要D ; u x f h为所有普遍使用的默认数据流收集器创建我们自己的实时模板。关注公众号互联网架构师,回复X c B关键字2T,获取最新架构视频例如,我们可以创建.toC C ; ? H [ #List缩写的实时模板,来自动插c @ B n j } n入适当的收集器.collect(Collectors.toList())。

下面是它在实际工作中的样子:

太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!

构建你自己的实时模板

让我们看看如何自己构建它。首先访问设置(Settings)并在左侧的菜单中选择实时模板。你也可以使用对话框左上角的便利的输入过滤。

太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!

下面我们可以通过右侧的+图标创建一个新的组,叫做Stream。接下来我们向组中添加所有数据流相关的实时模板。我经常使用默认的收集器toList、toSet、groupingBy 和 join,所以我为每个这些方法都创建了新的实时模板。

这一步非常重要。在添加新的实时模板之后,你需要在对话框底部指定6 5 h T q :合适的上下文。你需要选择Java → Other,然后定义缩写、描述和实际的模板代码。

// Abbreviation: .toList
.colP j ] * Llect(Collectors.toList())
// AbbrevG ( Z } = R T y yiation: .toc ] 1 { n RSet
.collect(Collectors.toSet())
// Abbt ? Z areviation: .join
.collf f # W b Tect(Collectors.joining("$END$"))
// Abbreviation: .groupBy
.collect(Collectors.groupingBy(e -> $END$))

特殊的变量$END$指定在使用模板之后的光标位置,所以你可以直接在这个位置上打字,例如,( 3 W I定义连接分隔符。; + a q o 4 a 8 Y

提示:你应该开启"Adn B + 3d unambiguous imports on the fly"(自动添加明确的导入)选项,便于让IDEA自动添加java.util.sP W B / , K H Ttream.CR e d H c E c M /ollectors的导入语句。选项在Editor → General → Auto Import中。

让我们在实际工作中看看这两个模板:

1、连接

太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!

2、分组

太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!

IntellH K & i * S 8ij IDEA中的实时模板非常灵活且强大。你可以用它来极大提升代码的P 2 Q r a生产力。

你知道实时模板可以拯救生G n , e ( M 1活的其它例子吗?

仍然不满意吗?在我的数据流教程中学习所h q : o ~ 4有你想要学到的东西。

祝编程愉| & C / U (快!

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhiC x B : 9bo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-07-21
本文作者:飞龙
本文来自:“互联网架构师”,了解相关信息可以关注“互联网架构师”