使用流过滤POJO列表-无法强制转换ClassCastException java.util.LinkedHashMap

时间:2018-09-18 13:43:05

标签: java serialization java-8 stream jackson

问题很熟悉,我的问题有点奇怪。

这是我拥有的POJO:

public class POJO implements Serializable {
    @JsonProperty("ID")
    private UUID id;

    @JsonProperty("Name")
    private String name;

    // getters and setters
}

我正在尝试使用以下代码来过滤此POJO的列表:

List<POJO> pojoList = getListOfPojosFromSomeMethod();
List<POJO> filteredPOJO = pojoList.stream()
                          .filter(p -> p.getName().equals("POJOName"))
                          .collect(Collectors.toList())

我无法过滤列表。我收到以下异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.models.POJO
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
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)

我也尝试使用地图:

List<POJO> pojoList = getListOfPojosFromSomeMethod();
List<POJO> filteredPOJO = pojoList.stream()
                          .filter(p -> p.getName().equals("POJOName")
                          .map(p -> new POJO(p))
                          .collect(Collectors.toList());

相同的例外。没有任何改变。我在某处读到例外是由于Jackson序列化。

如何同时使用流和Jackson过滤列表?我找不到解决方法。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试:

Predicate<POJO> filterPredicate = item -> "POJOName".equals(item.getName());

List<POJO> filteredPOJOs = pojoList.stream()
                      .filter(filterPredicate)
                      .collect(Collectors.toList())

答案 1 :(得分:0)

在第一个示例中没有问题:

    List<POJO> filteredPOJO = pojoList.stream()
                      .filter(p -> p.getName().equals("POJOName"))
                      .collect(Collectors.toList());

我只是注意到,在:equals(“ POJOName”)以关闭过滤器参数之后,缺少括号。