使用Java 8 Stream和ObjectMapper readValue方法

时间:2016-10-18 07:18:10

标签: java java-8 java-stream

我创建了一个迭代String列表的方法,并使用ObjectMapper readValue方法将其转换为POJO列表。

public static <T> List<T> mapPayloadListToPOJOList(List<String> payloadList, Class<T> pojo) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    List<T> pojoList = new ArrayList<>();
    for (String payload : payloadList) {
        T mapped = mapper.readValue(payload, pojo);
        pojoList.add(mapped);
    }
    return pojoList;
}
  1. 有没有办法可以使用Java 8流代替此实现?
  2. 你能帮我解决一下吗?
  3. 我试图使用地图,但它不允许应用Class<T>参数。

3 个答案:

答案 0 :(得分:2)

认为应该是map而不是forEach ..

payloadList.stream()
    .map(s -> mapper.readValue(s, pojo))
    .collect(Collectors.toList())

区别在于,map使用提供的lambda(List)将每个元素从原始s -> mapper.readValue(s, pojo)映射到新元素,而forEach执行side-effect对于原始List中的每个元素,不返回任何内容。

来自Java 8 stream tutorials

答案 1 :(得分:2)

可以通过删除for循环并将其替换为流来轻松完成,但lambda表达式在处理已检查的异常时会遇到一些问题。

您可以使用单独的转换方法解决它并在该方法中处理异常(通过记录它或将其重新抛出为未经检查的异常)。

    public static <T> List<T> mapPayloadListToPOJOList(List<String> payloadList, Class<T> pojo) {
        return payloadList.stream()
                          .map(string -> convert(string, pojo))
                          .collect(Collectors.toList());
    }

    public static <T> T convert(String string, Class<T> pojo) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(string, pojo);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

答案 2 :(得分:1)

是的,请检查此link,您可以将列表转换为流,然后使用类似

的内容映射每个值
payloadList.stream()
    .forEach( s -> mapper.readValue(s,pojo))
    .collect(Collectors.toList());