首页 > 解决方案 > 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!

标签: javajava-stream

解决方案


当你需要使用Streams 时,你可以使用这个:

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;
}

推荐阅读