我对流是陌生的,据我了解,这将返回流:
IntStream.range(0, 20).skip(10)
IntStream是一个接口,在Java api的默认部分中有此接口:
static IntStream range(int startInclusive,
int endExclusive)
但是,
IntStream skip(long n)
即使它显然具有实现,也未显示为在Java api中被声明为默认值。
有人可以解释为什么吗?
我认为您误会了。 IntStream
是一个接口。因此,实际的实现取决于...任何类决定将implements IntStream
放在其末尾。这样的类称为“ IntStream实现”。 IntStream实现可以自由地以任意方式实现skip方法和int流的整个概念。
问题是您不能说IntStream skip
的THE实现。您只能说IntStream skip
的AN实现。将某些skip实现硬编码为默认实现会很奇怪,特别是考虑到您将无法编写它:无论IntStream如何工作,如何实现对任何IntStream都适用的skip方法?
default impls通常被设计为与其他(非默认)方法一起用作基本构件。例如,java 8在java.util.Map
(这是一个接口)中添加了以下方法:getOrDefault(Object key, V defaultValue)
,这是根据map的get
方法和map的containsKey
方法实现的,它们都没有默认实现(它们是构建基块;要成为地图,您必须实现这些。)
那些基本构件?那些没有默认实现。重点是:此类接口的实现需要提供每个此类构造块方法的实现,其余方法(默认方法)将基于这些构造块工作,但是如果您也想实现这些方法,例如,因为您可以更有效地执行此操作,请放心。
哪个遗留了最后一个问题:skip
是一种“构建块”还是更复杂的“基于构建块”的方法?作者认为这是一个构建基块,并通过一次读取一个元素并将其丢弃直到丢弃X个元素来实现它,感觉太差了。
他们为什么做出这种选择?据我所知,您必须问作者,在公开辩论中没有涵盖这种详细讨论,您可以在例如lambda-dev的邮件列表中关注这些辩论。