栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

深入了解分离器特性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入了解分离器特性

我必须承认,当我第一次尝试找出特性的实际含义时,我也遇到了困难,并且感觉到它们的含义在Java 8的实现阶段没有被明确地确定,因此使用起来不一致。

考虑

Spliterator.IMMUTABLE

表示元素来源无法进行结构修改的特征值;也就是说,不能添加,替换或删除元素,因此在遍历期间不会发生此类更改。

看到此列表中的“已替换”很奇怪,当谈到a

List
或数组时,通常不将其视为结构修改,因此,流和分离器工厂接受数组(未克隆)的报告
IMMUTABLE
,例如
LongStream.of(…)
Arrays.spliterator(long[])

如果我们将其更宽泛地解释为“只要客户端无法观察到”,则不会有显着差异

CONCURRENT
,因为在两种情况下,都会向客户端报告 某些
元素,而无法识别在遍历期间是否添加了 这些 元素,或者是否由于无法移除,有些未报告,因为无法倒带分隔器并进行比较。

规范继续:

一个没有报告

IMMUTABLE
CONCURRENT
预期具有
ConcurrentModificationException
关于遍历过程中检测到的结构性干扰的书面策略(例如throw)的分隔器。

这是唯一相关的事情,保证分隔符报告

IMMUTABLE
CONCURRENT
永远不会抛出
ConcurrentModificationException
。当然,从语义上
CONCURRENT
排除
SIZED
,但这对客户端代码没有影响。

实际上,这些特性在Stream API中并未用于任何用途,因此,不一致地使用它们将永远不会在某处引起注意。

这也是的解释,为什么 每个
中间操作中具有清热的效果

CONCURRENT
IMMUTABLE
NONNULL
特性:数据流实现不使用它们,代表流状态的内部类不维护他们。


同样,

NONNULL
在任何地方都不会使用它,因此某些流没有它不会起作用。我可以将
LongStream.of(…)
问题归结为内部使用
Arrays.spliterator(long[],int, int)
哪些代表
Spliterators.spliterator​(long[] array, int fromIndex, int toIndex, intadditionalCharacteristics)

返回的分隔符始终报告特性

SIZED
SUBSIZED
。调用方可以为分隔符提供其他特征以进行报告。(例如,如果知道不会进一步修改数组,请指定
IMMUTABLE
;如果认为数组数据具有相遇顺序,请指定
ORDERED
)。该方法
Arrays.spliterator(long[],int,int)
通常可以替代地使用,它返回一个spliterator该报告
SIZED
SUBSIZED
IMMUTABLE
,和
ORDERED

再次注意该

IMMUTABLE
特性的不一致用法。它被再次处理等不必保证不存在任何变形,而在同一时间,
Arrays.spliterator
并依次
Arrays.stream
LongStream.of(…)
将报告
IMMUTABLE
特性,即使是规格,而不能保证呼叫方将不会修改他们的阵列。除非我们考虑将元素设置为非结构性修改,否则整个区别将再次变得无意义,因为数组无法进行结构性修改。

而且它明确规定没有

NONNULL
特征。很明显,原始值不能为
null
,并且
Spliterator.Abstract<Primitive>Spliterator
类始终注入
NONNULL
特性,但返回的分隔符
Spliterators.spliterator​(long[],int,int,int)
不会继承自
Spliterator.AbstractLongSpliterator

不好的是,这不能在不更改规格的情况下得到解决,而好的事情是,它没有任何后果。


因此,如果我们忽略了任何问题

CONCURRENT
IMMUTABLE
或者
NONNULL
,它们没有什么后果,我们有

SIZED
skip
limit
。这是一个众所周知的问题,是这种方法的结果,
skip
并且
limit
已由Stream
API实现。其他实现是可以想象的。这也适用于无限流与的组合,该组合
limit
应具有可预测的大小,但考虑到当前的实现,则没有。

Stream.concat(…)
与结合
Stream.empty()
。这听起来是合理的空流并 没有
结果顺序施加约束。但是
Stream.concat(…)
当只有一个输入没有命令时,释放命令的行为值得怀疑。请注意,对订购太过激进并不是什么新鲜事,有关此行为的问与答(首先被认为是有意为之,但后来在Java
8,update 60中已得到修复)。也许
Stream.concat
在此时也应该进行讨论…

的行为

.boxed()
很容易解释。当像天真那样实施时
.mapToObj(Long::valueOf)
,它将简单地失去所有知识,因为
mapToObj
不能假设结果仍然是排序或不同的。但这已在Java
9中修复。那里
LongStream.range(0,10).boxed()
具有一些
SUBSIZED|SIZED|ORDERED|SORTED|DISTINCT
特性,可以维护与实现相关的所有特性。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号