【问题标题】:Why methods for streams are not declared as default in java api? [closed]为什么流的方法没有在 java api 中声明为默认值? [关闭]
【发布时间】:2019-12-27 15:24:26
【问题描述】:

我是流的新手,据我所知,这会返回一个流:

IntStream.range(0, 20).skip(10)

IntStream 是一个接口,在 java api 的默认部分有这个:

static IntStream range(int startInclusive,
                       int endExclusive)

然而,

IntStream skip(long n)

在 java api 中没有显示为默认声明,即使它显然有一个实现。

有人可以详细说明原因吗?

【问题讨论】:

  • “它显然有一个实现”:在哪里?

标签: java methods interface java-stream


【解决方案1】:

我想你误会了。 IntStream 是一个接口。因此,实际的实现取决于......任何类决定在其末尾添加implements IntStream。这样的类称为“IntStream 实现”。 IntStream 实现可以随意实现 skip 方法和 int 流的整个概念。

问题是你不能说 THE IntStream skip 的实现。您只能说 IntStream skipAN 实现。将 skip 的某些实现硬编码为默认实现会很奇怪,尤其是考虑到您无法编写它:无论 IntStream 如何工作,您将如何实现适用于任何 IntStream 的 skip 方法?

默认实现通常被设计为与其他(非默认)方法一起使用作为基本构建块。例如java 8在java.util.Map(是一个接口)中添加了如下方法:getOrDefault(Object key, V defaultValue),按照map的get方法和map的containsKey方法实现,两者都没有默认实现(它们是构建块;要成为地图,您必须实现这些)。

那些基本的构建块?那些没有默认实现;这就是重点:此类接口的实现需要提供每个此类构建块方法的实现,其余方法(默认方法)将根据这些构建块正常工作,但如果您也想实现这些,例如,因为您可以更有效地做到这一点,请随意。

最后一个问题是:skip 是一种“构建块”还是更复杂的“构建在构建块上”的方法?作者认为它是一个构建块,并且通过一次读取一个元素并丢弃它们直到 X 元素被丢弃来实现它,感觉太明显了。

他们为什么做出这样的选择?你得问问作者,据我所知,这种详细的讨论在公开辩论中是不涉及的,你可以关注例如lambda-dev等邮件列表。

注意:您提到的 range 方法是静态的。静态方法就像命名构造函数:该方法根本不需要上下文或现有流:相反,它创建一个新的IntStream 流经范围。它产生IntStream 接口的一个特定实现;还有很多其他的存在,它实现skip 的方式不一定适用于流内实现的其他实现。

【讨论】:

  • 那么 IntStream.range(0, 20) 返回一个具有 skip() 实现的 IntStream?
  • @zzzz11222333 是的,没错。
猜你喜欢
  • 2011-05-22
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 2010-11-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多