【发布时间】:2018-10-01 17:36:24
【问题描述】:
我正在编写一个函数,它采用一系列 keyExtractor 函数来生成一个 Comparator(假设我们有一个具有许多属性的对象,并且希望能够以任意顺序任意比较大量属性)。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
class Test {
public static <T, S extends Comparable<S>> Comparator<T> parseKeysAscending(List<Function<T, S>> keyExtractors) {
if (keyExtractors.isEmpty()) {
return (a, b) -> 0;
} else {
Function<T, S> firstSortKey = keyExtractors.get(0);
List<Function<T, S>> restOfSortKeys = keyExtractors.subList(1, keyExtractors.size());
return Comparator.comparing(firstSortKey).thenComparing(parseKeysAscending(restOfSortKeys));
}
}
public static void main(String[] args) {
List<Extractor<Data, ?>> extractors = new ArrayList<>();
extractors.add(new Extractor<>(Data::getA));
extractors.add(new Extractor<>(Data::getB));
Comparator<Data> test = parseKeysAscending(
extractors.stream()
.map(e -> e)
.collect(Collectors.toList()));
}
}
class Extractor<T, S extends Comparable<S>> implements Function<T, S> {
private final Function<T, S> extractor;
Extractor(Function<T, S> extractor) {
this.extractor = extractor;
}
@Override
public S apply(T t) {
return extractor.apply(t);
}
}
class Data {
private final Integer a;
private final Integer b;
private Data(int a, int b) {
this.a = a;
this.b = b;
}
public Integer getA() {
return a;
}
public Integer getB() {
return b;
}
}
对我来说主要有三个困惑:
1)。如果我不定义 Extractor 类,这将无法编译。我不能直接拥有 Functions 或某种功能接口。
2)。如果我删除恒等函数映射行“.map(e -> e)”,则不会进行类型检查。
3)。我的 IDE 说我的函数正在接受 Data -> 类型的函数列表?不符合 parseKeysAscending 函数的边界。
【问题讨论】:
-
这里确实似乎发生了一些奇怪的事情。值得问我的问题,因为我的 IDE 也优化了映射但随后立即拒绝编译。您使用的是什么版本的 Java?
-
这个问题正在meta讨论
标签: java generics java-8 functional-programming comparator