簡體   English   中英

java Streams:收集考慮流是空的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM