我有一个类,可以指定可选a
Comparator
。
由于
Comparator
是可选的,我必须评估它的存在并执行相同的流代码,无论是否有 sorted()
:
if(comparator != null) {
[...].stream().map()[...].sorted(comparator)[...];
} else {
[...].stream().map()[...];
}
问题:
有没有更优雅的方法来做到这一点而不需要重复代码?
注:
默认
Comparator
不是一个选项,我只想保持正在流式传输的值的原始顺序。
此外,元素已经在排序时映射,因此我无法以某种方式引用流的根列表,因为我不再拥有原始元素。
你可以这样做:
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)
另一种方法是使用
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());
您可以定义您类型的比较器(我在这里使用 E 作为占位符),它不会改变顺序:
Comparator<E> NO_SORTING = (one, other) -> 0;
如果比较器字段是 Comparator 的可选字段,则可以使用
.sorted(comparator.orElse(NO_SORTING))
如果您不介意使用第三方库StreamEx
StreamEx(source).[...].chain(s -> comparator == null ? s : s.sorted(comparator)).[...];
您可以使用辅助功能来完成此操作。
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))
[...];
您不需要知道中间流类型。
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;
}