资讯专栏INFORMATION COLUMN

使用Intellij IDEA 解决Java8的数据流问题

dreamGong / 3465人阅读

摘要:使用解决的数据流问题原文译者飞龙协议在年三月发布,距离现在年三月五号快有一年了。除了,最实用的特性是新的数据流。是吧,注是浏览器上的数据流的接口,并解决了上述问题。

使用Intellij IDEA 解决Java8的数据流问题

原文:Fixing Java 8 Stream Gotchas with IntelliJ IDEA

译者:飞龙

协议:CC BY-NC-SA 4.0

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

除了lambda,最实用的特性是新的数据流API。集合操作在任何我见过的代码库中都随处可见。而且对于那些集合操作,数据流是提升代码可读性的好方法。

但是一件关于数据流的事情十分令我困扰:数据流只提供了几个终止操作,例如reducefindFirst属于直接操作,其它的只能通过collect来访问。工具类Collctors提供了一些便利的收集器,例如toListtoSetjoininggroupingBy

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

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

在迁移了300k行代码到数据流之后,我可以说,toListtoSet、和groupingBy是你的项目中最常用的终止操作。所以我不能理解为什么不把这些方法直接集成到Stream接口上面,这样你就可以直接编写:

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

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

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

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

无论如何,IntelliJ IDEA声称它是最智能的Java IDE。所以让我们看看如何使用IDEA来解决这一问题。

使用 IntelliJ IDEA 来帮忙

IntelliJ IDEA自带了一个便利的特性,叫做实时模板(Live Template)。如果你还不知道它是什么:实时模板是一些常用代码段的快捷方式。例如,你键入sout并按下TAB键,IDEA就会插入代码段System.out.println()。更多信息请见这里。

如何用实时模板来解决上述问题?实际上我们只需要为所有普遍使用的默认数据流收集器创建我们自己的实时模板。例如,我们可以创建.toList缩写的实时模板,来自动插入适当的收集器.collect(Collectors.toList())

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

构建你自己的实时模板

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

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

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

// Abbreviation: .toList
.collect(Collectors.toList())

// Abbreviation: .toSet
.collect(Collectors.toSet())

// Abbreviation: .join
.collect(Collectors.joining("$END$"))

// Abbreviation: .groupBy
.collect(Collectors.groupingBy(e -> $END$))

特殊的变量$END$指定在使用模板之后的光标位置,所以你可以直接在这个位置上打字,例如,定义连接分隔符。

提示:你应该开启"Add unambiguous imports on the fly"(自动添加明确的导入)选项,便于让IDEA自动添加java.util.stream.Collectors的导入语句。选项在Editor → General → Auto Import中。

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

连接

分组

Intellij IDEA中的实时模板非常灵活且强大。你可以用它来极大提升代码的生产力。你知道实时模板可以拯救生活的其它例子吗?请让我知道!

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

祝编程愉快!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64967.html

相关文章

  • 事件派发器模式

    摘要:在项目开发中,会遇到如下情形我们自己的服务订阅接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的行动,这种情况下适合应用派发器模式。 在项目开发中,会遇到如下情形:我们自己的服务订阅、接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的行动,这种情况下适合应用派发器模式。 主要模块 XXXEventDispatcher类核心类,维护事件类型(EventType...

    Yujiaao 评论0 收藏0
  • IntelliJ IDEA 2017.1 EAP与异步堆栈跟踪调试器扩展

    摘要:带有一个新的调试器捕获这改变了堆栈跟踪相关各部分用异步代码执行接收器与相应地区的堆栈跟踪捕获的异步代码传递发送方。 反应性编程趋势后,我们的代码越来越异步。 showImg(https://cscdn.maxleap.cn/2.0/download/NTZmMGQ0NzdhNWZmN2YwMDAxZWJlMjg1/zcf-1eb1a6d0-09be-4382-ad89-8c640cc4...

    赵春朋 评论0 收藏0
  • 【原创】mysql优化

    摘要:在这种情况下,加上可以增加性能。这样一样,数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。 1:当只要一行数据时使用 LIMIT 1 当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索...

    senntyou 评论0 收藏0
  • JAVA语法糖和语法糖编译

    摘要:提供给了用户大量的语法糖,比如泛型自动装箱拆箱循环变长参数内部类枚举类断言新特性方法引用等解语法糖语法糖的存在主要是方便开发人员使用。 首先,部分总结文字引用 简书作者:Eric新之助 。链接:https://www.jianshu.com/p/4de08deb6ba4 已获得授权 showImg(https://segmentfault.com/img/bVbfuX9?w=646&...

    weakish 评论0 收藏0
  • IntelliJ IDEA 16预览版更新内容说明

    摘要:线程过去,跨过一个线程意味着要恢复所有的其他线程,而版开始只需要恢复当前线程即可。快速搜索新版本改进了快速搜索的弹出菜单,会将搜索项高亮显示。终于新增支持。 调试器 Groovy表达式 从16版开始,Evaluate Expression 和 Watches可以使用更短且更具表现力的Groovy表达式进行调试,而Groovy表达式以前只能用于Groovy代码。 线程 过去,跨过一个线程...

    iKcamp 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<