Java 流式传输列表并创建单个对象

Aka*_*ari 1 java java-stream java-17

Boolean我有一个看起来像这样的字段列表:

var lst = List.of(true, false, false, false);
Run Code Online (Sandbox Code Playgroud)

有一个这样的对象:

public class GetBatchStatusResponse {
  String batchCompleted;
  Integer totalCount;
  Integer processed;
  Integer pending;
}
Run Code Online (Sandbox Code Playgroud)

上面的对象当前填充有如下内容:

var resp = new GetBatchStatusResponse();

resp.setBatchCompleted(String.valueOf( !lst.contains(false));
resp.setTotalCount(lst.size());
resp.setProcessed((int)(lst.stream().filter(p ->p!=null && p == true).count()));
resp.setPending((int)(lst.stream().filter(p ->p==null || p == false).count()));
Run Code Online (Sandbox Code Playgroud)

如何在单个循环中使用流 API 实现同样的效果?

k31*_*159 6

我会用我认为最简单的方式来做:

var trueCount = Collections.frequency(lst, true);
var resp = new GetBatchStatusResponse();

resp.setBatchCompleted(String.valueOf(trueCount == lst.size());
resp.setTotalCount(lst.size());
resp.setProcessed(trueCount);
resp.setPending(lst.size() - trueCount);
Run Code Online (Sandbox Code Playgroud)

不要立即考虑使用流来解决每个可以想到的问题,但请记住,有时您可以使用更有用的 Collections 方法。