Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java8中使用stream将集合/数组转换为JSONArray_Java_Arrays_Java 8_Stream_Java Stream - Fatal编程技术网

如何在Java8中使用stream将集合/数组转换为JSONArray

如何在Java8中使用stream将集合/数组转换为JSONArray,java,arrays,java-8,stream,java-stream,Java,Arrays,Java 8,Stream,Java Stream,我有一个双数组,我需要使用javastreams将数组转换成JSONArray。我尝试使用forEach(共享可变性),这会导致数据丢失 public static JSONArray arrayToJson(double[] array) throws JSONException{ JSONArray jsonArray = new JSONArray(); Arrays.stream(array) .forEach(jsonArray::put);

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

public static JSONArray arrayToJson(double[] array) throws JSONException{
    JSONArray jsonArray = new JSONArray();
    
    Arrays.stream(array)
         .forEach(jsonArray::put);  

    return jsonArray;
}

是否有任何方法可以使用streams创建
JSONArray

您的代码可以工作,但您可以编写类似这样的东西(
jdk 8+
):

还有一个示例(从
列表创建
字符串

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

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

JSONArray
不是线程安全的。如果使用并行流,则应同步操作

Arrays
    .stream(array)
    .parallel()
    .forEach(e -> {
        synchronized(jsonArray) {
            jsonArray.put(e);
        }
    });

您所说的“数据丢失”是什么意思?您的代码工作正常,没有数据丢失。您使用的是什么JSon库!为什么使用并行流,目的是什么?请编辑您的问题并添加这些信息,这可能会有所不同。
JSONArray
不是线程安全的,您可以看到文档。看起来不错,但编译器抱怨:错误:方法引用中抛出的类型不兼容JSONException.Collector(Collector.of(JSONArray::new,JSONArray::put,JSONArray::put))如果同步操作,则不需要使用parallel,因为它没有任何优势。
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);
                }
            }
    );
}
Arrays
    .stream(array)
    .parallel()
    .forEach(e -> {
        synchronized(jsonArray) {
            jsonArray.put(e);
        }
    });