我有一串字符串。每个字符串代表json对象,例如:
// {"foo": "bar", "bar": "foo"}
String s1 = "{\"foo\": \"bar\", \"bar\": \"foo\"}";
我从数据库中获取了大量数据,这就是我使用Stream的原因。 我想将此数据流式传输到输出以进行http响应。
try (Stream<String> data = service.streamData()) {
os.write("[".getBytes());
eventStream.forEach(s -> {
try {
os.write(s.getBytes());
os.write(",".getBytes());
os.write("\n".getBytes());
} catch (IOException e) {
logger.error(e.getMessage());
}
});
}
os.write("{}]".getBytes());
os.flush();
由于每个字符串代表一个json对象,我想返回这些对象的数组。在这种情况下,我必须手动添加"["
和"]"
并使用逗号分隔流中的每个元素。但最终我会在最新元素后面有一个逗号。这不是一个有效的json。
看起来像这样:
["{"foo": "bar", "bar": "foo"}", "{"foo": "bar1", "bar": "foo1"}",]
如何使用流来删除最新的逗号?
答案 0 :(得分:2)
请注意,虽然lambda表达式是一个简洁的特性,但匿名内部类仍未存在。如果您需要有状态的消费者,他们是正确的工具。你甚至不需要条件:
stream.forEach(new Consumer<String>() {
int header = '[';
public void accept(String string) {
try {
os.write(header);
os.write('\n');
os.write(string.getBytes(StandardCharsets.UTF_8));
header=',';
} catch (IOException e) {
logger.error(e.getMessage());
}
}
});
os.write('\n');
os.write(']');
如果您必须处理空流,可以将其扩展为
os.write('[');
stream.forEach(new Consumer<String>() {
int header = ' ';
public void accept(String string) {
try {
os.write(header);
os.write('\n');
os.write(string.getBytes(StandardCharsets.UTF_8));
header=',';
} catch (IOException e) {
//logger.error(e.getMessage());
}
}
});
os.write('\n');
os.write(']');