【问题标题】:com.googlecode.json-simple & Java Streams not working togethercom.googlecode.json-simple & Java Streams 不能一起工作
【发布时间】:2019-07-02 09:56:22
【问题描述】:

我无法让 com.googlecode.json-simple 和 Java-8 流协同工作。

以下代码不起作用:

JSONArray jsonArray = new JSONArray();
List<String> a = jsonArray.stream()
        .map(o -> ((Map)o).get("s"))
        .map(Object::toString)
        .collect(Collectors.toList());

上面写着:

java: incompatible types: java.lang.Object cannot be converted to java.util.List<java.lang.String>

但它应该可以工作,因为我在收集之前明确地将流对象类型转换为String

【问题讨论】:

  • 您是否注意到我在答案中提到了假设jsonArrayList&lt;Object&gt;?无论如何,是什么让你这样做jsonArray.stream() 否则?
  • 因为 JSONArray 在内部扩展了list。而且它是未参数化的,因此存在问题
  • 你是对的。我很遗憾错过了extends 部分。这肯定会带来很多未经检查的演员警告。但是,如果您确定 JSON 是一个列表,则对索引进行迭代可能会奏效。

标签: java json java-8 java-stream collectors


【解决方案1】:

由于 JSONArray 扩展了 ArrayList 但没有将类型绑定到它,一种方法可能是在索引上迭代列表,而不是:

JSONArray jsonArray = new JSONArray();
List<String> list = IntStream.range(0, jsonArray.size())
    .mapToObj(i -> ((Map) jsonArray.get(i)).get("s"))
    .map(Object::toString)
    .collect(Collectors.toCollection(ArrayList::new));

【讨论】:

  • 你测试了吗?我刚刚做了,它不起作用。给出相同的编译错误
  • @PankajSinghal 好吧,我现在编译它。不过,还没有针对任何实际的 JSON 数据进行测试。
  • @PankajSinghal 嗯,这主要是因为原始类型转换collect 无法推断返回类型。如果您尝试将代码分解为 Stream&lt;String&gt; a = jsonArray.stream() .map(o -&gt; ((Map) o).get("s")) .map(Object::toString); 的片段,这会将 Stream 显式转换为 Stream&lt;String&gt; 然后收集 List&lt;String&gt; res = a.collect(Collectors.toList()); 它仍然可以编译。但请注意,对于未经检查的对 map 的调用,在这种情况下,它的结果也可能会被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2013-01-13
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多