欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
本文由 ImportNew - 一杯哈希不加盐 翻译自 javacodegeeks。接待插手翻译小组。转载请见文末要求。

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 中有越发形象化的暗示:

我们可以与   <a href=劳务调派打点系统 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 界说处配置断点:

我们可以与   <a href=劳务调派打点系统 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 模式运行):

我们可以与   <a href=劳务调派打点系统 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,劳务派遣管理系统,下面用红圈标出:

我们可以与   <a href=劳务调派打点系统 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 时,会看到下面这张图:

我们可以与   <a href=劳务调派打点系统 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

计较统计