From 0dcd804ec1d87685bf4e3c5b0513089ef3a43203 Mon Sep 17 00:00:00 2001 From: Joe <736777445@qq.com> Date: Sat, 4 Apr 2020 21:48:02 +0800 Subject: [PATCH] =?UTF-8?q?Update=2047.=20=E4=BC=98=E5=85=88=E4=BD=BF?= =?UTF-8?q?=E7=94=A8Collection=E8=80=8C=E4=B8=8D=E6=98=AFStream=E6=9D=A5?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=96=B9=E6=B3=95=E7=9A=84=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\350\277\224\345\233\236\347\261\273\345\236\213.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/notes/47. \344\274\230\345\205\210\344\275\277\347\224\250Collection\350\200\214\344\270\215\346\230\257Stream\346\235\245\344\275\234\344\270\272\346\226\271\346\263\225\347\232\204\350\277\224\345\233\236\347\261\273\345\236\213.md" "b/docs/notes/47. \344\274\230\345\205\210\344\275\277\347\224\250Collection\350\200\214\344\270\215\346\230\257Stream\346\235\245\344\275\234\344\270\272\346\226\271\346\263\225\347\232\204\350\277\224\345\233\236\347\261\273\345\236\213.md" index 217f903..21d4405 100644 --- "a/docs/notes/47. \344\274\230\345\205\210\344\275\277\347\224\250Collection\350\200\214\344\270\215\346\230\257Stream\346\235\245\344\275\234\344\270\272\346\226\271\346\263\225\347\232\204\350\277\224\345\233\236\347\261\273\345\236\213.md" +++ "b/docs/notes/47. \344\274\230\345\205\210\344\275\277\347\224\250Collection\350\200\214\344\270\215\346\230\257Stream\346\235\245\344\275\234\344\270\272\346\226\271\346\263\225\347\232\204\350\277\224\345\233\236\347\261\273\345\236\213.md" @@ -2,7 +2,7 @@   许多方法返回元素序列(sequence)。在 Java 8 之前,通常方法的返回类型是 `Collection`,`Set` 和 `List` 这些接口;还包括 `Iterable` 和数组类型。通常,很容易决定返回哪一种类型。规范(norm)是返回 `Collection` 接口。如果该方法仅用于启用 for-each 循环,或者返回的序列不能实现某些 `Collection` 方法 (通常是 `contains(Object)`),则使用迭代(`Iterable`)接口。如果返回的元素是基本类型或有严格的性能要求,则使用数组。在 Java 8 中,将流(Stream)添加到平台中,这使得为序列返回方法选择适当的返回类型的任务变得非常复杂。 -  你可能听说过,流现在是返回元素序列的明显的选择,但是正如第 45 条所讨论的,流不会使迭代过时:编写好的代码需要明智地将流和迭代结合起来。如果一个 API 只返回一个流,并且一些用户想用 for-each 循环遍历返回的序列,那么这些用户肯定会感到不安。这尤其令人沮丧,因为 `Stream` 接口有一个和 `Iterable` 接口中一样的抽象方法,并且 `Stream` 的方法规范与 `Iterable` 中的一致。阻止程序员使用 for-each 循环在流上迭代的唯一原因是 `Stream` 无法继承 `Iterable`。 +  你可能听说过,流现在是返回元素序列的明显的选择,但是正如第 45 条所讨论的,流不会使迭代过时:编写好的代码需要明智地将流和迭代结合起来。如果一个 API 只返回一个流,并且一些用户想用 for-each 循环遍历返回的序列,那么这些用户肯定会感到不安。尤其令人沮丧的是, `Stream` 接口有一个和 `Iterable` 接口中一样的抽象方法,并且 `Stream` 的方法规范与 `Iterable` 中的一致。阻止程序员使用 for-each 循环在流上迭代的唯一原因是 `Stream` 无法继承 `Iterable`。   遗憾的是,这个问题没有好的解决方法。 乍一看,似乎可以将方法引用传递给 `Stream` 的 iterator 方法。 结果代码可能有些乱,但并非不合理: @@ -149,5 +149,5 @@ public static Stream> of(List list) {   这两种子列表的流实现都可以,但都需要一些用户使用流-迭代适配器 ( Stream-to-Iterable adapte),或者在更自然的地方使用流。流-迭代适配器不仅打乱了客户端代码,而且在我的机器上使循环速度降低了 2.3 倍。一个专门构建的 Collection 实现 (此处未显示) 要冗长,但运行速度大约是我的机器上基于流的实现的 1.4 倍。 -  总之,在编写返回元素序列的方法时,请记住,某些用户可能希望将它们作为流处理,而其他用户可能希望迭代方式来处理它们。 尽量适应两个群体。 如果返回集合是可行的,请执行此操作。 如果已经拥有集合中的元素,或者序列中的元素数量足够小,可以创建一个新的元素,那么返回一个标准集合,比如 `ArrayList`。 否则,请考虑实现自定义集合,就像我们为幂集程序里所做的那样。 如果返回集合是不可行的,则返回流或可迭代的,无论哪个看起来更自然。 如果在将来的 Java 版本中,`Stream` 接口声明被修改为继承 `Iterable`,那么应该随意返回流,因为它们将允许流和迭代处理。 +  总之,在编写返回元素序列的方法时,请记住,某些用户可能希望将元素序列作为流处理,而其他用户可能希望迭代方式来处理。 尽量满足两个群体。 如果返回集合是可行的,请执行此操作。 如果已经拥有集合中的元素,或者序列中的元素数量足够小到可以创造一个新的序列,那么返回一个标准集合,比如 `ArrayList`。 否则,请考虑实现自定义集合,就像我们为幂集程序里所做的那样。 如果返回集合是不可行的,则返回流或可迭代的,无论哪个看起来更自然。 如果在将来的 Java 版本中,`Stream` 接口声明被修改为继承 `Iterable`,那么你就应该返回 `Stream` ,因为它可以同时被流和迭代处理。 -- GitLab