在查看源代码时,我发现
虽然两个类的
那么,有没有任何原因可以解释为什么要覆盖
Collections.UnmodifiableMap.UnmodifiableEntrySet
中覆盖了stream()
方法。但是代码似乎与Collection.stream()
完全相同,只是在Collections.UnmodifiableMap.UnmodifiableEntrySet.stream()
中返回的类型更加具体,即Stream<Entry<K,V>>
而不仅仅是在Collection.stream()
中的Stream<E>
。虽然两个类的
spliterator()
方法不同,但即使未覆盖stream
方法,如果对象是UnmodifiableEntrySet
类型,则从Collection.stream()
调用UnmodifiableEntrySet.spliterator()
。那么,有没有任何原因可以解释为什么要覆盖
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);
}
UnmodifiableEntrySet
是Entry
的集合而Collection
是泛型的,我不确定是什么困惑了你。 - Aniket SahrawatUnmodifiableEntrySet
应该覆盖stream()
方法,如果方法体与Collection.stream()
完全相同。 - Gautham MStream<Entry<K,V>>
不是一个Stream<E>
。另一个例子是List<String>
不是一个List<Object>
。 - Arvind Kumar AvinashUnmodifiableEntrySet
和UnmodifiableCollection
中重写的stream
,这样stream
调用将会到Collection
中,spliterator
调用将会调用UnmodifiableEntrySet
中的重写版本。从您的角度来看,我的理解是返回的流将是一个通用流,而不是Entry
流。如果是这样,那么我就不能在该流上调用map(Entry::value)
。但我确实能做到。请也审查一下我的答案。 - Gautham Mstream
的实现,你会注意到它已经在7个地方被重写了。相关的重写在UnmodifiableCollection
中,然后再次在UnmodifiableEntrySet
中。UnmodifiableCollection#stream
基本上是将调用委托给传递的任何Collection
。如果在UnmodifiableEntrySet
中没有重写,那么调用将被委托给原始的Collection
(可变的)。 - Aniket Sahrawat