Java 8 MOOC - 第 3 节总结

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

昨晚是讨论 java 8 mooc 的 最后一次聚会。 8 月在一个经常超过 40°c 的城市举办的任何活动都将面临挑战,因此很高兴我们有早期会议的与会者以及新人。

本次会议的目的是讨论第 3 课,同时也总结了整个课程:讨论我们喜欢什么以及我们应该改进什么(关于课程本身和我们的用户组活动)。

与前 两篇 文章 一样,让我们​​概述一下我们的讨论领域:

findany() vs findfirst() :为什么我们需要这两种方法,什么时候使用它们?

好吧, findfirst() 是确定性版本,它将返回流中的第一个元素(根据遇到的顺序 - 请参阅 文档中关于排序的 部分)。因此,无论您是并行运行操作还是串行运行操作,如果您要查找“a”并在此列表中使用 findfirst


 ["b", "z", "c", "a", "l", "k", "a", "h"]

您将获得索引 3 处的元素 - 列表中的第一个“a”。

但是 findany() 是不确定的,所以会返回任何符合条件的元素——它可能会返回索引 3 处的元素,或者位置 6 处的元素。实际上,如果流位于有序集合(如列表)中,当您在顺序流上运行 findany 时,我希望它会返回与 findfirst 相同的结果。 findany 的真正用例是当您在并行流上运行它时。让我们采用上面的列表,并假设当您在并行流上运行它时,它由两个单独的线程处理:


 ["b", "z", "c", "a", "l", "k", "a", "h"]

线程 2 有可能在线程 1 找到位置 3 的那个之前找到它的“a”(位置 6 的那个),所以这将是返回的值。通过将流配置为返回与条件匹配的任何一个值,您可以在并行运行时更快地执行操作。

如果 findany 在并行运行时(可能)更快并且在串行运行时(可能)返回与 findfirst 相同的值,为什么不一直使用它呢?好吧,有时候您确实想要第一个项目。如果你有一个按电影发行年份排序的 dvd 列表,你想找到原始的“金刚”(例如),你会想要 findfirst 找到 1933 年发行的那个,而不是那个发行的1976 年或 2005 年的那个。

另外, findfirst 并不总是比 findany 慢,即使是并行的。回到我们的列表:


 ["b", "z", "c", "a", "l", "k", "a", "h"]

尝试 findfirst findany 对于“h”这两种方法的性能可能相同。

收藏家 :也许只有我没有真正看到收藏家的大局。我对内置的收集器非常满意,例如:


 ["b", "z", "c", "a", "l", "k", "a", "h"]


 ["b", "z", "c", "a", "l", "k", "a", "h"]

很容易看到它们的作用,并在需要使用它们时计算出来。

我也很高兴发现 joining


 ["b", "z", "c", "a", "l", "k", "a", "h"]

创建我在 Java 8 演示 中使用的逗号分隔值 (csvs) 的超级有用方法。

对我来说事情变得有点模糊的地方是我们开始链接收集器的地方:


 ["b", "z", "c", "a", "l", "k", "a", "h"]

(从我缺乏明确的例子可以看出,我不能 100% 确定这些在什么情况下有用)。

作为一个群体,我们认为链式收集器有点丑——不是因为我们反对链式(我们喜欢流),而是可能因为它是链式参数中的另一个链式。

我们认为在这个领域,一些好的、可靠的例子和一些日常使用将使开发人员更加清楚。我们希望。

与此相关,该课程根本没有涉及创建您自己的收藏家。我个人(消息灵通)的观点是,我猜大多数开发人员应该能够使用开箱即用的收集器( tolist 等)或使用收集器链来构建他们需要的东西。如果您需要自定义收集器,也许您还没有考虑到所有已经可用的东西。但作为一个团队,我们决定我们无论如何都希望看到这个话题,这样我们就可以更深入地了解收藏家是什么以及他们是如何工作的。

第 3 课的练习: 嗯。我们能说什么?我真的希望读这篇文章的人还没有完成课程,因为 sevilla java 用户组想对你说:不要绝望,第 3 课的练习比第 1 课和第 2 课的练习难得 。老实说,整个团队都认为这不是学习曲线,而是需要攀登的巨大悬崖。

我的意思是,能以如此具有挑战性的事情结束真是太好了,但如果我们能够逐渐达到那个水平而不是突然出现在我们身上,它可能不会那么自我毁灭。

第 3 课练习的第 2 部分的好处是我们在小组中讨论了三个截然不同的答案。我们中没有一个人对其中任何一个都非常满意,但我们可以看到每种方法的明确优点和缺点,这是你真正想在这样的课程中学习的东西。

在您自己的计算机上运行粗略的性能测试也非常棒,这样您就可以真正看到您的选择对流性能的影响。

了解更多信息
我要在这里为朋友的书添加一个无耻的插件。我已经为这门课程阅读了很多关于 Java 8 的内容,为了我的 Java 8 演示 ,并且通常可以跟上速度。我最喜欢的了解 lambdas 和流的书是 java 8 lambdas: pragmatic functional programming 这本书也包含更多关于收集器的信息,所以也许我们关于如何在更复杂的情况下使用它们的一些问题在这里得到了回答。

总之
我们真的很喜欢 mooc,也很喜欢聚在一起讨论它的会议。我们特别喜欢聚会是提出问题和讨论替代解决方案的安全场所,并且我们不需要成为天才级别的专家才能充分参与。

如果/当 Oracle 重新运行 mooc 时,如果您这次没有机会参加,我强烈建议您注册。如果你能找到(或举办)本地聚会来讨论它,它会让体验变得更加有趣。