我看到以下代码(JDK 16、JDK 17):
public static <T>
Collector<T, ?, List<T>> toUnmodifiableList() {
return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
list -> {
if (list.getClass() == ArrayList.class) { // ensure it's trusted
return SharedSecrets.getJavaUtilCollectionAccess()
.listFromTrustedArray(list.toArray());
} else {
throw new IllegalArgumentException();
}
},
CH_NOID);
}
Run Code Online (Sandbox Code Playgroud)
使用if (list.getClass() == ArrayList.class) {检查有什么意义?为什么不简单地使这段代码像这样简单
return new CollectorImpl<>(ArrayList::new, ArrayList::add,
(left, right) -> { left.addAll(right); return left; },
list -> SharedSecrets.getJavaUtilCollectionAccess().listFromTrustedArray(list.toArray()),
CH_NOID);
Run Code Online (Sandbox Code Playgroud)
通过替换为List::add,ArrayList::add我们提供了类的最具体的方法句柄,而不是接口。最后一个代码假设累加器实例将作为 …