如何在Java8中使用stream将集合/数组转换为JSONArray
我有一个双数组,我需要使用java如何在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);
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);
}
});