为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 Java 供应商绑定到对象的实例?

如何将 Java 供应商绑定到对象的实例?

慕尼黑8549860 2021-11-03 10:59:24
如何将 Java 绑定Supplier到对象的现有实例?例如,如果我想compareTo()使用此标头编写自己的方法:public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) {...}我希望能够这样称呼它:myCompareTo("Hello", "Hello2", String::length);其中String(大写字母)是一个类,没有对象。那么如何将实例绑定o1到供应商呢?
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

这是您正在寻找的内容(我相信):


public static <T, U extends Comparable<U>> int compare(T o1, T o2, Function<T, U> mapper) {

    return mapper.apply(o1).compareTo(mapper.apply(o2));

}

你可以这样称呼它:


compare("str1", "str2", String::length); // 0


查看完整回答
反对 回复 2021-11-03
?
慕仙森

TA贡献1827条经验 获得超7个赞

感谢您的回答。其实我现在想通了。我想要提供的对象实例(o1 和 o2)来执行给定的方法。我发现供应商是错误的接口,而我不得不使用函数。在这里你可以看到我的工作简化示例:


public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter) {

        return getter.apply(o1).compareTo(getter.apply(o2));

}

接口必须是Function 而不是Supplier 的原因是,只有Function 等价于使用对象并调用对象上的引用方法的lambda 表达式。


例如,如果您将方法引用定义为:


Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();

那么正在执行的等效 lambda 表达式是:


(instance) -> instance.referencedMethod()

附加信息:


编辑:我知道我可以通过使用 Comparator 来做同样的事情,但这个例子非常简化。在我的应用程序中,这种功能是必要的。我必须创建一个 compareTo 函数,该函数按多个属性对 ArrayList 进行排序,因为主要排序属性在列表中可能不是唯一的。我想与您分享我的代码,因为我认为这对您来说可能是一个有趣的见解。


public static <T> int ultimateCompare(T o1, T o2, Function<T, Comparable>... getters) {

    for (Function<T, Comparable> getter : getters) {

        int result = getter.apply(o1).compareTo(getter.apply(o2));

        if (result != 0) return result;

    }

    return 0;

}

例如,您可以按姓氏对人员列表进行排序,如果其中两个相同,则可以使用名字进行排序。使用此解决方案,您可以在运行时更改排序。


查看完整回答
反对 回复 2021-11-03
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

实际上,定义方法的更正确方法是:


private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu) {

    return Comparator.comparing(fu).compare(left, right);

}


查看完整回答
反对 回复 2021-11-03
  • 3 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信