Java 8流-使用自定义收集器时发生NullPointerException

凯威

我已经通过实现Collector接口并重写其方法来实现了一个自定义收集器。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());

当上面的语句被执行时,我得到了一个N​​ullPointerException,如下所示:

java.util.stream.ReduceOps $ 3.getOpFlags(ReduceOps.java:185)处的线程“ main”中的java.lang.NullPointerException,java.util处的java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) .stream.ReferencePipeline.collect(ReferencePipeline.java:499)位于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常量)。

核心点是:该接口包含该方法。而“我没有使用此部分”仍然需要您“合理地”实施该方法。因此,请记住这一点:将来,任何返回集合的接口都允许通过返回内容来表示“无内容” 而不是一个空的东西!

当然,最后,周围的框架可能会看到问题,而不检查该方法是否返回null。但正如说:当你处理任何类型的集合,忘了如何使用空。如果什么也没有,请创建该类型空集合对象!

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

除此之外,正如Eugene指出的那样-您可能想非常仔细地检查是否真的应该在此处使用空Set。换句话说:您是否研究过特征并了解它们的整个概念;并且您100%确定要在这里“无”吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用带有 java 8 流的自定义收集器时获取 ClassCastException

来自分类Dev

使用自定义收集器进行Java 8分组?

来自分类Dev

使用 Java 8 流和收集器嵌套值

来自分类Dev

Java 8 流收集

来自分类Dev

Java 8流收集集

来自分类Dev

如何使用Java 8流?

来自分类Dev

GroupingBy使用Java 8流

来自分类Dev

Java 8-如何使用流收集器对地图列表进行分组和求和

来自分类Dev

JAVA-8流收集高级用法

来自分类Dev

从Java 8中的流收集同步的arraylist

来自分类Dev

java8流收集不同的列表

来自分类Dev

带有自定义比较器的java-8 Map.entry到SortedMap的流

来自分类Dev

Java 8流组合器从未调用

来自分类Dev

的java 8流的多个滤波器

来自分类Dev

使用Java 8流的反向映射结构

来自分类Dev

如何使用流编写它?Java 8

来自分类Dev

使用Java 8流聚合信息

来自分类Dev

使用java8流构建集合

来自分类Dev

转换逻辑以使用Java 8流

来自分类Dev

使用 java 8 流映射减少

来自分类Dev

转换列表对象为使用Java 8个流对象的自定义地图

来自分类Dev

java流收集器没有映射器?

来自分类Dev

Java8 Stream 在并行流中的终端操作上的自定义 SWT 侦听器中失败

来自分类Dev

Java 8使用流java.io.UncheckedIOException读取文件

来自分类Dev

使用Java8流减少Java列表中的元素

来自分类Dev

使用流Java 8在List Java中进行修改

来自分类Dev

为什么在Java 8中按顺序收集并行流

来自分类Dev

收集HashSet / Java 8 / Regex模式/流API

来自分类Dev

的java 8流收集最大对象,并通过不同的属性