gpt4 book ai didi

java-8 - Java 8 Stream - 使用自定义收集器时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 13:25:44 25 4
gpt4 key购买 nike

我通过实现 Collector 接口(interface)并重写它的方法实现了一个自定义收集器。 Collector 实现如下:

class MyCustomCollector implements Collector<Person, StringJoiner, String>{

@Override
public Supplier<StringJoiner> supplier() {
// TODO Auto-generated method stub
return () -> new StringJoiner("|");
}

@Override
public BiConsumer<StringJoiner, Person> accumulator() {
// TODO Auto-generated method stub
return (joiner,person) -> joiner.add(person.name.toUpperCase());
}

@Override
public BinaryOperator<StringJoiner> combiner() {
// TODO Auto-generated method stub
return (joiner1, joiner2) -> joiner1.merge(joiner2);
}

@Override
public Function<StringJoiner, String> finisher() {
// TODO Auto-generated method stub
return StringJoiner::toString;
}

@Override
public Set<java.util.stream.Collector.Characteristics> characteristics() {
// TODO Auto-generated method stub
return null;
}
}

这是我的 Person 类:

class Person implements Comparable<Object>{
String name;
int age;

Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return name;
}

public int compareTo(Object obj){
int returnValue;
if(age ==((Person) obj).age)
returnValue=0;
else
if(age >((Person) obj).age)
returnValue = 1;
else
returnValue =-1;

return returnValue;
}

public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;

return (age == ((Person) obj).age);
}

public int hashCode()
{
return name.hashCode();
}

}

这是我的调用语句...

List<Person> persons =
Arrays.asList(
new Person("Max", 18),
new Person("Peter", 23),
new Person("Pamela", 23),
new Person("David", 12),
new Person("Pam", 23));
String names2 = persons.stream()
.collect(new MyCustomCollector());

当上面的语句被执行时,我得到一个 NullPointerException 如下:

Exception in thread "main" java.lang.NullPointerException at java.util.stream.ReduceOps$3.getOpFlags(ReduceOps.java:185) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.my.j8.TestStreams.main(TestStreams.java:231)

谁能告诉我哪里出错了?

最佳答案

这里:

public Set<java.util.stream.Collector.Characteristics> characteristics() {
return null;

返回一个集合而不是null;喜欢

private final static Set<Characteristics> EMPTY = Collections.emptySet();

...

return EMPTY;

或者只是

return Collections.emptySet();

(因为 Collections 类本身已经有一些 EMPTY 常量)。

核心点是:这个接口(interface)包含那个方法;而“我没有使用这部分”仍然需要你“合理地”实现那个方法。因此,为将来牢记这一点:任何返回集合的接口(interface)都允许通过返回一个的东西来表示“无内容”;而不是一个null的东西!

当然,最终问题可能会被周围的框架看到,不会检查该方法是否返回 null。但如前所述:当您处理任何类型的集合时,请忘记使用 null。如果什么都没有,就创建一个该类型的集合对象!

避免 NPE 的一个关键步骤是首先不返回 null。

除此之外:正如 Eugene 所指出的那样 - 您可能需要非常仔细地检查您是否真的应该在这里使用一个空的 Set。换句话说:你调查过Characteristics吗?并理解它们的全部概念;你 100% 确定这里不想要“无”吗?!

关于java-8 - Java 8 Stream - 使用自定义收集器时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com