java - java Streams:收集考虑流是空的
问题描述
我想使用这样的代码构建一个Sort
对象:Optional
private Sort buildSort(Collection<String> fields) {
fields.stream()
.map(this::buildOrder)
.collect(Sort.unsorted(), ????, ????);
}
buildOrder
是:
private Order buildOrder(String field) {
if (field.startsWith("-")) {
return Order.desc(field.substring(1));
}
else {
return Order.asc(field);
}
}
我需要返回一个Sort.unsorted()
if 流为空,或者组合每个Sort
对象。
排序对象有一个and
代表构建和连接订单的方法。
Sort.by(sort1)
.and(sort2)...
所以我需要:
if (stream is empty) then
return Sort.unsorted
else
return foreach item in stream:
Sort.by(item).and(item2).and(item3)...
课程:
org.springframework.data.domain.Sort
org.springframework.data.domain.Sort.Order
笔记
我需要使用stream-api!
解决方案
当你需要使用Stream
s 时,你可以使用这个:
public Sort buildSort(Collection<String> fields) {
return fields.stream()
.map(this::buildOrder)
.map(Sort::by)
.reduce(Sort.unsorted(), Sort::and);
}
旧答案
由于该buildOrder()
方法不返回空Sort.Order
,您可以先检查是否fields
为空,然后直接返回 a Sort.unsorted()
。
而对于排序的组合,你甚至可能不想使用一个Stream
而是一个普通的循环:
public Sort buildSort(Collection<String> fields) {
if(fields.isEmpty()) {
return Sort.unsorted();
}
Sort result = null;
for(String field : fields) {
Sort.Order order = buildOrder(field);
if(result == null) {
// initially create a Sort
result = Sort.by(order);
} else {
// then just concatenate them
result = result.and(order);
}
}
return result;
}
推荐阅读
- arrays - 设置指针数组
- tensorflow - 用于不平衡时间序列分类的 LSTM
- node.js - "message": "无法读取未定义的属性 'firstName'"
- python - 在 tkinter 中将两个窗口合并为一个窗口
- import - 需要脚本来输出网络适配器名称和输出到 .CSV 文件
- node.js - Nightwatch 未按预期从端点返回数据
- c# - 如何将 ViewData 从类传递给 Action 方法?
- android - 如何将数据从 RecyclerView 传递到 Kotlin 中的 DialogFragment?
- django - 如何在具有 Jsonfield 的模型中发布 django rest 中的数据
- scala - 使用 finagle 的简单 hello world api - 错误:对象 twitter 不是包 com 导入 com.twitter.finagle.Http 的成员