我已经通过实现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());
当上面的语句被执行时,我得到了一个NullPointerException,如下所示:
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] 删除。
我来说两句