【问题标题】:Filter a list of POJO using streams - getting ClassCastException java.util.LinkedHashMap cannot be cast使用流过滤 POJO 列表 - 无法投射 ClassCastException java.util.LinkedHashMap
【发布时间】:2019-02-22 13:45:47
【问题描述】:

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

这是我拥有的 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 过滤列表?我找不到解决方案。

提前致谢。

【问题讨论】:

  • 这与流或收集等无关。这个问题被称为heap pollution,是关于欺骗编译器,使其认为你的pojoListList&lt;POJO&gt;实际上是List&lt;LinkedHashMap&lt;String, Object&gt;&gt;(当没有足够的可用类型信息时,这是 JSON 序列化/反序列化库使用的类型)。提示:如果你在 getListOfPojosFromSomeMethod 方法中使用了奇怪的强制转换,我敢打赌这就是问题所在。
  • @FedericoPeraltaSchaffner 我正在从 getListOfPojosFromSomeMethod 方法内的 Hashmap 中检索 List。一旦我在检索它们时使用了正确的转换,流就可以无缝运行!

标签: java serialization java-8 stream jackson


【解决方案1】:

第一个例子没有问题:

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

我刚刚注意到在 : equals("POJOName") 之后缺少一个括号来关闭过滤器参数。

【讨论】:

    【解决方案2】:

    你可以试试:

    Predicate<POJO> filterPredicate = item -> "POJOName".equals(item.getName());
    
    List<POJO> filteredPOJOs = pojoList.stream()
                          .filter(filterPredicate)
                          .collect(Collectors.toList())
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-05-27
    相关资源
    最近更新 更多