Java Streams - 如果比较器存在则排序

时间:2017-07-27 06:07:59

标签: java sorting java-8 java-stream

我有一个类可选可以指定Comparator

由于Comparator是可选的,我必须评估其存在并执行相同的流代码,使用sorted()或不使用:

if(comparator != null) {
    [...].stream().map()[...].sorted(comparator)[...];
} else {
    [...].stream().map()[...];
}

问题:
如果没有代码重复,有更优雅的方法吗?

注意:
默认Comparator不是一个选项,我只想保留我正在流式传输的值的原始顺序。

此外,元素已经在排序点映射,所以我不能以某种方式引用流的根列表,因为我不再拥有原始元素。

5 个答案:

答案 0 :(得分:7)

您可以这样做:

Stream<Something> stream = [...].stream().map()[...]; // preliminary processing
if(comparator != null) {
    stream = stream.sorted(comparator); // optional sorting
}
stream... // resumed processing, which ends in some terminal operation (such as collect)

答案 1 :(得分:3)

另一种方法是使用Optional

Stream<Whatever> stream = [...].stream().map()[...];

List<WhateverElse> result = Optional.ofNullable(comparator)
    .map(stream::sorted)
    .orElse(stream)
    .[...] // <-- go on with the stream pipeline
    .collect(Collectors.toList());

答案 2 :(得分:1)

你可以定义你的类型的比较器(我在这里使用E作为占位符),它不会改变顺序:

 Comparator<E> NO_SORTING = (one, other) -> 0;

如果比较器字段是比较器的可选项,则可以使用

.sorted(comparator.orElse(NO_SORTING))

答案 3 :(得分:1)

如果您不介意使用第三方库StreamEx

StreamEx(source).[...].chain(s -> comparator == null ? s : s.sorted(comparator)).[...];

答案 4 :(得分:0)

您可以使用辅助功能完成此操作。

static <T, R> R applyFunction(T obj, Function<T, R> f) {
    return f.apply(obj);
}

applyFunction([...].stream().map()[...],
    stream -> comparator == null ? stream : stream.sorted(comparator))
    [...];

您不需要了解中间流类型。