mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-03-29 21:50:14 +08:00
Update 47. 优先使用Collection而不是Stream来作为方法的返回类型.md
This commit is contained in:
parent
531aa25346
commit
329dbd040c
@ -1,8 +1,8 @@
|
||||
# 47. 优先使用 Collection 而不是 Stream 来作为方法的返回类型
|
||||
|
||||
许多方法返回元素序列(sequence)。在 Java 8 之前,通常方法的返回类型是 `Collection`,`Set` 和 `List` 这些接口;还包括 `Iterable` 和数组类型。通常,很容易决定返回哪一种类型。规范(norm)是集合接口。如果该方法仅用于启用 for-each 循环,或者返回的序列不能实现某些 `Collection` 方法 (通常是 `contains(Object)`),则使用迭代(`Iterable`)接口。如果返回的元素是基本类型或有严格的性能要求,则使用数组。在 Java 8 中,将流(Stream)添加到平台中,这使得为序列返回方法选择适当的返回类型的任务变得非常复杂。
|
||||
许多方法返回元素序列(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 方法。 结果代码可能有点嘈杂和不透明,但并非不合理:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user