collectors.tomap()在内部提供npe

8ftvxx2r  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(330)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

12个月前关门了。
改进这个问题
我尝试在流执行中以map的形式收集数据。
以确保我没有任何我正在使用的副本 merger function 但最终却得到了npe。
请参见代码段

streamableList().stream()
    .filter(Objects::nonNull)
    .filter(it-> nonNull(it.getKeyHere()))
    .collect(toMap(it -> it.getKeyHere(),
            it -> it.getValueHere(), (a1, a2) -> a1));

参见下面的例外

java.lang.NullPointerException: null
        at java.util.HashMap.merge(HashMap.java:1216)
        at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
        at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
        at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)....
.....and further calls of written code....

有人能提出为什么它在收集时失败以及如何解决吗?

w1e3prcc

w1e3prcc1#

编辑

我只是查了一下 HashMap 来自Java1.8的代码。以下是片段。当要合并的值作为 null .

@Override
public V merge(K key, V value,
               BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    if (value == null)
        throw new NullPointerException();

原岗位

是的,正如@pshema所指出的 it.getValueHere() 退货 null ,我们得到这个错误。这是复制品。

public class NPECollectorsToMap{

    public static void main( String[] args ){
        Map<String, String> map = doThis();
        System.out.println( map );
    }

    private static Map<String, String> doThis() {
        return streamableList().stream()
        .filter(Objects::nonNull)
        .filter(it-> nonNull(it.getKeyHere()))
        .collect(toMap(it -> it.getKeyHere(),
                it -> it.getValueHere(), (a1, a2) -> a1));
    }

    private static List<It> streamableList(){
        List<It> list = new ArrayList<>();
        list.add( new It( "a", null ) );
        return list;
    }

    private static class It{
        private String keyHere;
        public It( String keyHere, String valueHere ){
            super();
            this.keyHere = keyHere;
            this.valueHere = valueHere;
        }
        private String valueHere;
        public String getKeyHere(){ return keyHere; }
        public void setKeyHere( String keyHere ){ this.keyHere = keyHere; }
        public String getValueHere(){ return valueHere; }
        public void setValueHere( String valueHere ){ this.valueHere = valueHere; }

    }
}
h7appiyu

h7appiyu2#

HashMap::merge 如果任何值为null,则引发。

@Override
public V merge(K key, V value,
               BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    if (value == null)
        throw new NullPointerException(); //here

所以呢 getValueHere 必须返回 null . 只对项和键执行null检查,而不检查值。
您可以添加另一个筛选器,或者确保您的类不包含空值。

.filter(it -> Objects.nonNull(it.getValueHere()))

相关问题