- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在查看源代码时,我可以看到 stream()
方法已在 Collections.UnmodifiableMap.UnmodifiableEntrySet
中被覆盖.但代码似乎与 Collection.stream()
相同除了 Collections.UnmodifiableMap.UnmodifiableEntrySet.stream()
中的返回类型更具体地说是Stream<Entry<K,V>>
而不仅仅是 Stream<E>
如 Collection.stream()
.
spliterator()
两个类的方法都不同,但即使 stream
没有被覆盖我认为 UnmodifiableEntrySet.spliterator()
将从 Collection.stream()
调用如果对象的类型是 UnmodifiableEntrySet
.
那么,stream
有什么原因吗?方法被重写了?
Collection.java
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
Collections.UnmodifiableMap.UnmodifiableEntrySet.java
@SuppressWarnings("unchecked")
public Spliterator<Entry<K,V>> spliterator() {
return new UnmodifiableEntrySetSpliterator<>(
(Spliterator<Map.Entry<K, V>>) c.spliterator());
}
@Override
public Stream<Entry<K,V>> stream() {
return StreamSupport.stream(spliterator(), false);
}
最佳答案
以下 Java 文档/程序来自openjdk 14 2020-03-17。
spliterator
的主要原因和 stream
是为了保证UnmodifiableEntrySet
的进入未修改。来自 UnmodifiableEntrySet
的评论:
We need this class in addition to UnmodifiableSet as Map.Entries themselves permit modification of the backing Map via their setValue operation. This class is subtle: there are many possible attacks that must be thwarted.
开始,UnmodifiableEntrySet
延伸UnmodifiableSet
延伸 UnmodifiableCollection
.在 UnmodifiableCollection
,代理模式用于避免修改支持 Collection
c,大多数方法只是调用支持 Collection
方法,例如 spliterator
和 stream
:
@Override
public Spliterator<E> spliterator() {
return (Spliterator<E>)c.spliterator();
}
@SuppressWarnings("unchecked")
@Override
public Stream<E> stream() {
return (Stream<E>)c.stream();
}
所以如果UnmodifiableEntrySet
不覆盖这些方法,行为将遵循 UnmodifiableCollection
实现,支持条目将被公开并可以通过 Entry#setValue
进行修改.
因此 spliterator
和 stream
方法被覆盖并且UnmodifiableEntrySetSpliterator
引入是为了用 UnmodifiableEntry
包装对支持条目的所有访问, 确保条目不能被修改。
UnmodifiableCollection
覆盖 stream
?好像没必要重写stream
在UnmodifiableCollection
,因为我们可以在 Collection
中使用默认实现(只需通过 spliterator
创建流)。但作者决定覆盖 stream
使用背衬 Collection c
stream
方法,可能的原因之一是支持 Collection
可以覆盖 stream
出于性能原因的方法,例如Collections.CopiesList
,或者它是 spliterator
方法不符合 Collection#stream 的要求
This method should be overridden when the spliterator() method cannot return a spliterator that is IMMUTABLE, CONCURRENT, or late-binding. (See spliterator() for details.)
关于java - 为什么 Collections.UnmodifiableMap.UnmodifiableEntrySet 覆盖 stream() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66197054/
看着java.util.Collections.unmodifiableMap实现(OpenJDK 11): /** * Returns an unmodifiable view o
我从一个方法返回一个不可修改的映射。我如何确保任何试图修改返回映射的代码都会出现编译时错误,而不是运行时错误? 我的类(class): public class Foo { private f
这更像是一个好奇心问题。假设我为 Collections.unmodifiableMap() 提供了一个访问顺序设置为 true 的 LinkedHashMap。由于读取实际上是在修改 map 。这是
Colelction.unmodifiableMap 是否保护迭代顺序? 我正在尝试 newMap.put(key,Collections.ModifiableMap(oldMap))然后,当我执行
我有一个 hashmap其中包含大约一千个条目。现在我必须以无法在类外修改的方式公开它。所以我这样写 public static Map getResponseCodeSource() { r
所以我是 Hadoop 和 MapReduce 的新手,正在尝试创建一个简单的 WordCount 程序。但是,在运行它时,我遇到了一个错误: Exception in thread "main" j
我最近在阅读Java Concurrency in Practice,第一次接触到Collections.unmodifiableMap(...) 方法。该方法围绕现有 Map 创建一个只读包装器,任
我刚刚收到以下堆栈跟踪: 2015-12-20 07:43:36.151 -0800 ERROR o.s.s.s.TaskUtils$LoggingErrorHandler [taskExecutor
这个问题在这里已经有了答案: Immutable vs Unmodifiable collection [duplicate] (11 个回答) 关闭8年前。 上下文 我需要返回对我用于数据缓存的 m
在查看源代码时,我可以看到 stream()方法已在 Collections.UnmodifiableMap.UnmodifiableEntrySet 中被覆盖.但代码似乎与 Collection.s
我有一个引用: public final static LinkedHashMap> DELEGATES; 我初始化如下: static { LinkedHashMap> tmp = new
我正在尝试将参数映射从 ServletRequest 转换为 Scala 2.9.0.1 中的 Scala Map: val params = request.getParameterMap.asIn
Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap 在 Ruby 标准 API 中是否有等价物? 最佳答案 使用free
我打算使用 unmodifiableMap来自 Collections 类的 API。 我正在使用此 API 来限制其他类修改我的父 Map 对象。 我知道这个 API 比创建 Map 的新副本要好,
当我尝试使用 StepExecutionContext 在步骤之间共享数据时遇到此错误。我对这个框架非常陌生,所以我希望这是一个简单的问题,但据我所知,它一定在框架上,因为我没有在任何地方使用“Unm
我是一名优秀的程序员,十分优秀!