当前位置: 首页 > 面试题库 >

如何使用Java 8中的流将collection /数组转换为JSONArray

甘祺
2023-03-14
问题内容

我有一个double数组,我需要使用java流将其转换为JSONArray。我尝试使用forEach(共享可变性),这会导致数据丢失。

public static JSONArray arrayToJson(double[] array) throws JSONException{
    JSONArray jsonArray = new JSONArray();

    Arrays.stream(array)
         .forEach(jsonArray::put);

    return jsonArray;
}

有什么办法可以使用流创建JSONArray吗?


问题答案:

您的代码有效,但是您可以编写如下代码jdk 8+):

return Arrays.stream(array)
             .collect(Collector.of(
                          JSONArray::new, //init accumulator
                          JSONArray::put, //processing each element
                          JSONArray::put  //confluence 2 accumulators in parallel execution
                     ));

另外一个示例(String从创建一个List<String>

List<String> list = ...
String str = list.stream()
                 .collect(Collector.of(
                    StringBuilder::new,
                    StringBuilder::append,
                    StringBuilder::append,
                    StringBuilder::toString //last action of the accumulator (optional)  
                 ));

看起来不错,但编译器抱怨:错误:方法引用.collect(Collector.of(JSONArray :: new,JSONArray ::
put,JSONArray :: put)中不兼容的抛出类型JSONException

我检查这个上jdk 13.0.1JSON 20190722并没有发现除了问题Expected 3 arguments, but found 1.collect(...)

摇篮implementation group: 'org.json', name: 'json', version: '20190722'

解决

public static JSONArray arrayToJson(double[] array) throws JSONException {
    return Arrays.stream(array).collect(
            JSONArray::new,
            JSONArray::put,
            (ja1, ja2) -> {
                for (final Object o : ja2) {
                    ja1.put(o);
                }
            }
    );
}

注意
JSONArray::put合并器不能仅作为方法引用,因为这只会将一个数组放入另一个数组(例如[[]]),而不是按照所需的行为实际组合它们。



 类似资料:
  • 我正在尝试创建一个简单的解析util,它转换一个两列CSV文件并将其放入一个映射。 如您所见,我正在创建一个字符串流,用逗号分隔每一行,并将其转换为字符串数组,最后将键映射到索引0,将值映射到索引1。 出于某种原因,当我运行这个测试时,实际值为null。我排除了无效的文件路径,因为它在另一个单元测试中运行良好,并且键值出现在CSV中。我已经盯着它看了几个小时了,我想也许有人能指出我的错误。 此外,

  • 将Java 8转换为数组的最简单/最快捷的方法是什么?

  • 问题内容: 我想用来将json对象流放入json数组中,例如,从 至 但这行不通 自从我得到 问题答案: 用该选项将其混为一谈。 作为另一种选择,使用读取值是更灵活的选择。通常,您需要将此选项与选项结合使用,以防止第一个值过早消耗。

  • 更正:正如你们所指出的,我使用的是Java7。现在,方法就在那里。但问题仍然适用: 如何从字符串中获取?

  • 作为练习,我将一些旧代码转换为函数流。我对溪流了解不多。看起来转换这段代码应该很简单,但我运气不太好。该方法从给定的整数开始,将其传递给isPrime,如果它是prime,isPrime将返回true。然后将要打印的新(下一个)素数交给用户。如果isPrime为false,则i递增,我们检查下一个整数。

  • 问题内容: 如何自动将大小作为流的大小? 问题答案: 该被形成围绕其是迭代器的一种高级形式。这些可以报告某些特征,从而可以优化操作。他们还可能报告预期的元素数量,无论是估计的还是精确的。如果A事先知道元素数量,它将报告一个特征。 给定封装操作,您可以使用以下方法测试关于a元素的知识: 您可以使用它来学习某些操作如何影响有关元素的知识。例如,当您在以下测试程序中使用此方法时: 它将打印: 正如JB