我有一个类型为Comparator<Integer>
的比较器和一个表示为Pair::left
Function<Pair<Integer,?>,Integer>
函数(返回一个Integer
)。
我需要获得Comparator<Pair<Integer,?>>
型比较器。
如果我想简单地将函数Function<T,U>
映射到生成的函数Function<T,V>
通过函数Function<U,V>
我可以简单地应用andThen()
如下方法:
Function<Integer, String> toBinary = Integer::toBinaryString;
Function<Pair<Integer, ?>, Integer> left = Pair::left;
var pairToBinary = left.andThen(toBinary); // has type Function<Pair<Integer, ?>, String>
是否有可能以类似的方式获得Comparator<Pair<Integer,?>>
?
如果我正确理解了这个问题,您可以使用函数pairToBinary
作为Comparator.comparing()
中的参数来获得Comparator<Pair<Integer,?>>
类型的比较器。
record Pair<L, R>(L left, R right) {}
Function<Integer, String> toBinary = Integer::toBinaryString;
Function<Pair<Integer, ?>, Integer> left = Pair::left;
var pairToBinary = left.andThen(toBinary); // has type Function<Pair<Integer, ?>, String>
Comparator<Pair<Integer, ?>> comparator = Comparator.comparing(pairToBinary);
或者,您可以使用另一种风格的comparing(keyExtractor,keyComparator)
,在这种情况下,您不需要声明任何以下函数:
Comparator<Pair<Integer, ?>> comparator1 =
Comparator.comparing(Pair::left, // keyExtractor function
Comparator.comparing(Integer::toBinaryString)); // keyComparator which is capable of comparing objects produced by keyExtractor
我只有
Pair::left
和Comparator<Integer>
如果你手上有一个产生Integer
和Comparator<Integer>
的函数,这正是comparing(keyExtractor,keyComparator)
的用例。
你需要提供一个函数(Pair::left
或其他什么)作为第一个参数和一个比较器,它可以比较函数生成的对象,作为第二个参数:
Comparator.comparing(Pair::left, myIntComparator)