java stream逗号分隔

时间:2016-06-23 08:13:15

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

我有一串字符串。每个字符串代表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"}",]

如何使用流来删除最新的逗号?

1 个答案:

答案 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(']');