相关疑难解决方法(0)

Collectors.toMap中的Java 8 NullPointerException

如果其中一个值为'null' ,Java 8 Collectors.toMap将抛出一个NullPointerException.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap

另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?

我的问题的一个例子:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


class Answer {
    private int id;

    private Boolean answer;

    Answer() {
    }

    Answer(int id, Boolean answer) {
        this.id = id;
        this.answer = answer;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Boolean getAnswer() {
        return answer;
    }

    public void setAnswer(Boolean answer) {
        this.answer = answer;
    }
}

public class Main …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception java-8 java-stream collectors

292
推荐指数
7
解决办法
7万
查看次数

NullPointerException:元素无法映射到null键

我读过这个话题:

Collectors.groupingBy不接受null键

但我不明白如何将其应用于我的问题:

我的代码:

Map<String, List<MappingEntry>> mappingEntryMap = mapping.getMappingEntries()
                .stream()
                .collect(Collectors.groupingBy(MappingEntry::getMilestone, Collectors.mapping(e -> e, Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

对我来说MappingEntry::getMilestone有时可以返回null.这对我的情况没问题,但我看到:

Caused by: java.lang.NullPointerException: element cannot be mapped to a null key
    at java.util.Objects.requireNonNull(Objects.java:228)
    at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:907)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    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)
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免这种异常?

java grouping java-8 java-stream

7
推荐指数
2
解决办法
6015
查看次数

使用Java 8构建List数据并将其规范化为映射结构

因此,我还是Java 8的新手,仍在努力将流API与传统的迭代和集合相关联。

因此,我有一个具有3个属性的对象“ UserData”的列表,该列表都是非规范化数据。

 public class UserData {

        private String primaryAccountNumber;
        private String subAccountNumber;
        private String currency;
}
Run Code Online (Sandbox Code Playgroud)

样本输入数据将像

PrimaryAccNumber     SubAccNumber   Currency
PA00                 US00           USD
PA01                 US01           USD
PA01                 US02           USD
PA02                 EU00           EUR
PA03                 EU01           EUR
PA04                 CA00           CAD
PA04                 CA01           CAD
null                 IN00           INR
null                 IN01           INR
Run Code Online (Sandbox Code Playgroud)

预期的输出应该是这样的

USD  -> PA00 -> [US00]
        PA01 -> [US01,US02]
EUR  -> PA02 -> [EU00]
     -> PA03 -> [EU01]
CAD  -> PA04 -> [CA00,CA01]
INR  -> null (or dummykey)->[IN00,IN01]
Run Code Online (Sandbox Code Playgroud)

因此,我希望以某种方式对它进行规范化,以使输出结果是一个以货币为键的映射,而值应为另一个以主Acc和键与子帐户列表的值为键的映射。

Map<String, Map<String,List<String>>> …
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

5
推荐指数
1
解决办法
278
查看次数