Streams 很是强大,而且可以或许用简朴几行代码实现你所期望的成果要点。它们正常运行时很是流通优雅,但运行不切合预期时却让人苦不堪言。让我们进修一下如何用 IntelliJ 调试你的 Java Streams 代码,并洞察 Stream 的中间操纵。
在这篇文章中,昆山软件开发,我将在例子里用到 Sakila 样本数据库和 Speedment Stream ORM 框架。
道理
让我们从一个简朴的 Stream 开始,我们可以在 IntelliJ 为其建设一个根基的 Stream debugger:
List<String> strings = Stream.of("C", "A", "B") .sorted() .collect(toList());
上面的代码建设了一个由字符串 “A”、“B”、“C”构成的 Stream
。紧接着对这个 Stream
举办 sorted()
操纵,从而建设了一个新的 Stream
(至少在 Java 8-10 中是这样),个中的元素是第一个 Stream
的元素按字母排序的功效。也就是说,第二个 Stream
包括“A”、“B”、“C”三个元素。最后,昆山软件开发,这些将元素放到一个 List
中。
上面的代码和下面的等价:
Stream<String> s0 = Stream.of("C", "B", "A"); // "C", "A", "B" Stream<String> s1 = s0.sorted(); // "A", "B", "C" List<String> strings = s1.collect(toList()); // [“A”, “B”, “C”]
这概略上演示了 Stream debugger 如何事情。它将一个 stream 管道操纵支解成多个代码片断,一步一步地挪用中间运算操纵,从而可以保存每一步操纵的元素内容以供阐明。
Stream.of("C", "B", "A") .peek(saveStep(0)) .sorted() .peek(saveStep(1)) .collect(toList()); // The final result is saved to step 2
留意:真正的技能实现并不是上面这样,它只是提供了很好的概览。
在 IntelliJ’s debugger 中有越发形象化的暗示:
劳务调派打点系统 Stream debugger 交互" class="aligncenter size-full wp-image-30685" title="Snipaste_2018-11-30_12-54-01" src="/uploads/allimg/c181201/154360ScY40-1HS.jpg" />
它简捷明白地展示了 Stream 管道里的每其中间操纵细节,以及最后功效。
挪用
想挪用 stream debugger 的话,首先要在 Stream 界说处配置断点:
劳务调派打点系统 Stream debugger 交互" class="aligncenter size-full wp-image-30686" title="Snipaste_2018-11-30_12-54-59" src="/uploads/allimg/c181201/154360Sc93Y0-29D4.jpg" />
然后,启动调试会话(以 debug 模式运行):
劳务调派打点系统 Stream debugger 交互" class="aligncenter size-full wp-image-30687" title="Snipaste_2018-11-30_12-55-47" src="/uploads/allimg/c181201/154360Sc964F-3R20.jpg" />
当达到断点时,可以按指定的按钮(大概有些欠好找)来挪用 Stream debugger,劳务派遣管理系统,下面用红圈标出:
劳务调派打点系统 Stream debugger 交互" class="aligncenter size-full wp-image-30688" title="Snipaste_2018-11-30_12-56-36" src="/uploads/allimg/c181201/154360T00015P-4B02.jpg" />
这样就打开了 stream debugger,和上文所展示的一样。
数据库 Streams
我将利用 Speedment(stream ORM),它答允通过尺度的 Java Streams 操纵来查询数据库,因此也能通过 IntelliJ 来调试操纵。可以通过 Speedment initializer 来建设一个 Speedment 项目。
可以通过下面方法建设一个 Java 应用。
Speedment app = new SakilaApplicationBuilder() .withPassword("sakila-password") // Replace with your own password .build(); FilmManager films = app.getOrThrow(FilmManager.class);
此刻我们可以对数据库“film”表举办 stream 操纵。下面是个例子:
List<Film> map = films.stream() .filter(Film.LENGTH.equal(60)) .sorted(Film.RATING.reversed()) .collect(toList());
代码将从所有 Film
(影戏) 工具中筛选出长度为 60 分钟的,然后通过 Film.RATING
(评级)对这些 Film
工具举办排序(降序),最后将所有元素放入一个 List
。
我们挪用 Stream debugger 时,会看到下面这张图:
劳务调派打点系统 Stream debugger 交互" class="aligncenter size-full wp-image-30689" title="Snipaste_2018-11-30_12-58-29" src="/uploads/allimg/c181201/154360T0003420-54042.jpg" />
我们可以看到,初始 stream 中有 1000 部影戏。筛选操纵后,只剩 8 部影戏,紧接着排序并放到一个 List
。
计较统计