【问题标题】:java stream comma separatedjava流逗号分隔
【发布时间】:2016-10-25 10:37:56
【问题描述】:

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

任何想法如何使用流摆脱最新的逗号?

【问题讨论】:

  • 蹩脚(但常见)的方法是不在每条消息之后输出逗号,而是在每条消息之前输出它(第一个除外,可以通过布尔值处理)。跨度>
  • 另一种蹩脚(但常见)的方法是仅附加一个虚拟条目(假设您可以让客户端代码忽略它)。
  • Thilo,谢谢你的回答,我有点喜欢你的第一个建议,你能告诉我当我在流中使用每个元素时如何检查元素是否是第一个?
  • 您可以有一个 StringBuilder,在流的每次迭代中,您可以将 ",\n" 附加到(如果它为空)或输出(如果它不为空)。
  • 附带说明,os.write("[".getBytes());os.write(",".getBytes());os.write("\n".getBytes()); 是非常低效且无意中依赖于平台的方式来执行 os.write('[');os.write(',');os.write('\n');...

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


【解决方案1】:

请注意,虽然 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(']');

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2013-05-15
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2019-08-19
    • 2018-05-13
    相关资源
    最近更新 更多