为什么Java api中没有将流方法声明为默认方法?

问题描述 投票:-1回答:1

我对流是陌生的,据我了解,这将返回流:

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 stream
1个回答
0
投票

我认为您误会了。 IntStream是一个接口。因此,实际的实现取决于...任何类决定将implements IntStream放在其末尾。这样的类称为“ IntStream实现”。 IntStream实现可以自由地以任意方式实现skip方法和int流的整个概念。

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

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

那些基本构件?那些没有默认实现。重点是:此类接口的实现需要提供每个此类构造块方法的实现,其余方法(默认方法)将基于这些构造块工作,但是如果您也想实现这些方法,例如,因为您可以更有效地执行此操作,请放心。

哪个遗留了最后一个问题:skip是一种“构建块”还是更复杂的“基于构建块”的方法?作者认为这是一个构建基块,并通过一次读取一个元素并将其丢弃直到丢弃X个元素来实现它,感觉太差了。

他们为什么做出这种选择?据我所知,您必须问作者,在公开辩论中没有涵盖这种详细讨论,您可以在例如lambda-dev的邮件列表中关注这些辩论。

© www.soinside.com 2019 - 2024. All rights reserved.