[英]java Streams: collect taking in mind stream is empty
我想使用這個類似Optional
的代碼構建一個Sort
對象:
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()
,或者組合每個Sort
對象。
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
你可以使用這個:
public Sort buildSort(Collection<String> fields) {
return fields.stream()
.map(this::buildOrder)
.map(Sort::by)
.reduce(Sort.unsorted(), Sort::and);
}
由於buildOrder()
方法不返回空的Sort.Order
您最初可以檢查fields
是否為空,然后直接返回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;
}
我相信這應該有效。 第二個map
將每個Order
轉換為它自己的Sort
。 累加器和組合器然后只是添加Sorts
。
return fields.stream()
.map(this::buildOrder)
.map(Sort::by)
.collect(Sort::unsorted, Sort::and, Sort::and);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.