我有一个类型为Comparator<Integer>的比较器,并且希望获得类型为Comparator<Pair<Integer, ?>>的比较器,前提是我有一个类型为Function<Pair<Integer, ?>, Integer>Pair::left(它返回一个Integer).

如果我想使用Function<U, V>简单地将Function<T, U>映射到Function<T, 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<T>人来说,以任何方式都有可能实现同样的目标吗?

推荐答案

如果我没理解错的话,您可以使用您的函数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>

如果您手头有一台function,它可以产生IntegerComparator<Integer>,这正是comparing(keyExtractor,keyComparator)的用例.

您需要提供function(Pair::left或其他值)作为第一个参数,并提供comparator作为第二个参数,它可以比较function生成的对象:

Comparator.comparing(Pair::left, myIntComparator)

Java相关问答推荐

如何专门保存数据而不显示在jTable中?

使用json参数通过单击jSP文件中的按钮来运行server时出现问题

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

无法处理批处理侦听器中的反序列化异常

使用REST客户端和对象映射器从字符串反序列化Json

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

Bean定义不是从Spring ApplationConext.xml文件加载的

如何获取Instant#of EpochSecond(?)的最大值

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

找出承载Cargo 的最小成本

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

如何从命令行编译包中的所有类?

没有Tomcat,IntelliJ如何在本地运行API?

字符串的Gzip压缩在java11和java17中给出了不同的结果

Eureka客户端无法使用用户/通行证注册到Eureka服务器

如何在更改分辨率时将鼠标坐标计算为世界坐标

如何在Java中正确实现填字游戏求解器

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换