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

问题描述 投票:0回答:6

我有一个类,可以指定可选a

Comparator


由于

Comparator
是可选的,我必须评估它的存在并执行相同的流代码,无论是否有
sorted()

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

问题:
有没有更优雅的方法来做到这一点而不需要重复代码?

注:
默认

Comparator
不是一个选项,我只想保持正在流式传输的值的原始顺序。

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

java sorting java-8 java-stream
6个回答
8
投票

你可以这样做:

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)

4
投票

另一种方法是使用

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());

3
投票

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

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

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

.sorted(comparator.orElse(NO_SORTING))

1
投票

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

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

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))
    [...];

您不需要知道中间流类型。


0
投票

Java 对于这种情况还没有内置任何东西,并且 传递“null”导致异常

您可以创建一个util类StreamUtils并使用此功能

    /**
     * Resets a .stream().sorted() call and can be used for optional sorters
     *
     * Optional
     * .ofNullable(sorter)
     * .orElse(StreamUtils.naturalOrder())
     */
    public static <T> Comparator<T> naturalOrder() {
        return (o1, o2) -> 0;
    }
© www.soinside.com 2019 - 2024. All rights reserved.