如何使用<T> <U> 函数<T,U>将比较器映射到比较器?



我有一个类型为Comparator<Integer>比较器和一个表示为Pair::leftFunction<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::leftComparator<Integer>

如果你手上有一个产生IntegerComparator<Integer>的函数,这正是comparing(keyExtractor,keyComparator)的用例。

你需要提供一个函数(Pair::left或其他什么)作为第一个参数和一个比较器,它可以比较函数生成的对象,作为第二个参数:

Comparator.comparing(Pair::left, myIntComparator)

最新更新