我有一个来自使用Spring data JPA的数据库的数据流,它需要被Json序列化并写入http响应,而不需要存储在内存中.这是示例代码.

try (Stream<Employee> dataStream = empRepo.findAllStream()) {
        response.setHeader("content-type", "application/json");
        PrintWriter respWriter = response.getWriter();
        respWriter.write("[");     // array begin
        dataStream.forEach(data -> {
            try {
                respWriter.write(jsonSerialize(data));
                respWriter.write(",");
            } catch (JsonProcessingException e) {
                log(e);
            }
            entityManager.detach(data);
        });
        respWriter.write("]");    // array end
        respWriter.flush();
    } catch (IOException e) {
        log(e);
    }
}

但此逻辑将在最后一个元素之后写入额外的comma.如果它是最后一个元素,我怎么能不做respWriter.write(",");呢?

有流运算符的解决方案-peekreduce等,但最优化的解决方案是什么?有没有像Stream.hasNext()这样的东西,以便我可以在forEach中使用if条件?

推荐答案

首先,我想说的是,我不认为您的问题适合单个管道流.你对write电话和detach电话都有副作用.也许你更喜欢一个普通的for-loop?或者改为使用多个流?

话虽如此,您可以使用Eran在回答这个问题时描述的技术:Interleave elements in a stream with separator

try (Stream<Employee> dataStream = empRepo.findAllStream()) {
    response.setHeader("content-type", "application/json");
    PrintWriter respWriter = response.getWriter();
    respWriter.write("[");     // array begin
    dataStream.map(data -> {
        try {
            String json = jsonSerialize(data);

            // NOTE! It is confusing to have side effects like this in a stream!
            entityManager.detach(data);
            return json;
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    })
    .flatMap(json -> Stream.of(",", json))
    .skip(1)
    .forEach(respWriter::write);

    respWriter.write("]");    // array end
    respWriter.flush();
} catch (IOException e) {
    log(e);
}

Java相关问答推荐

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

在FML中删除关键帧动画

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

如何在返回bigint []值的子查询中使用any?

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

RichFaces 3.x-Spring Boot-迁移web.xml

无法了解Java线程所消耗的时间

Java:使用Class.cast()将对象转换为原始数组

虚拟线程应该很快消亡吗?

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

无法使用Freemarker从XML中读取重复的标记值

如何使用Criteria Builder处理一对多关系中的空值?

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

如何在不作为类出现的表上执行原生查询?

视图被推出线性布局-Android

在应用程序运行时更改LookAndFeel

没有Tomcat,IntelliJ如何在本地运行API?

@此处不能应用可为null的批注