小编Dmi*_*kov的帖子

为什么 Collectors.toUnmodifiableList 使用中间累加器的类型检查?

我看到以下代码(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::addArrayList::add我们提供了类的最具体的方法句柄,而不是接口。最后一个代码假设累加器实例将作为 …

java java-stream collectors

2
推荐指数
1
解决办法
58
查看次数

标签 统计

collectors ×1

java ×1

java-stream ×1