我想使用类似代码构建一个Sort对象Optional:
private Sort buildSort(Collection<String> fields) {
fields.stream()
.map(this::buildOrder)
.collect(Sort.unsorted(), ????, ????);
}
Run Code Online (Sandbox Code Playgroud)
buildOrder 是:
private Order buildOrder(String field) {
if (field.startsWith("-")) {
return Order.desc(field.substring(1));
}
else {
return Order.asc(field);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要返回一个Sort.unsorted()if流为空,或者组合每个Sort对象.
Sort对象有一个and代表构建和连接订单的方法.
Sort.by(sort1)
.and(sort2)...
Run Code Online (Sandbox Code Playgroud)
所以我需要:
if (stream is empty) then
return Sort.unsorted
else
return foreach item in stream:
Sort.by(item).and(item2).and(item3)...
Run Code Online (Sandbox Code Playgroud)
类别:
org.springframework.data.domain.Sort
org.springframework.data.domain.Sort.Order
Run Code Online (Sandbox Code Playgroud)
注意
我需要使用stream-api!
因为你需要使用Streams,你可以使用这个:
public Sort buildSort(Collection<String> fields) {
return fields.stream()
.map(this::buildOrder)
.map(Sort::by)
.reduce(Sort.unsorted(), Sort::and);
}
Run Code Online (Sandbox Code Playgroud)
由于该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;
}
Run Code Online (Sandbox Code Playgroud)
我相信这应该有效.第二个map将每个转换Order为它自己的Sort.然后累加器和组合器加Sorts在一起.
return fields.stream()
.map(this::buildOrder)
.map(Sort::by)
.collect(Sort::unsorted, Sort::and, Sort::and);
Run Code Online (Sandbox Code Playgroud)