如何将Java Supplier
绑定到对象的现有实例?例如,如果要使用此标头编写自己的compareTo()
方法:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) {...}
我希望能够这样称呼它
myCompareTo("Hello", "Hello2", String::length);
其中String
(带有大写字母)是一个类,没有对象。那么如何将实例o1
绑定到供应商?
答案 0 :(得分:4)
这是您要搜索的(我相信):
request.user
您可以这样称呼:
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));
}
答案 1 :(得分:3)
实际上,定义方法的更正确方法是:
private fun checkUsername(username: String) {
cancelSubscription()
checkUsernameDisposable = ApiService()
.checkUsername(username)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
updateUi(it)
}
}
答案 2 :(得分:2)
感谢您的回答。其实我现在想通了。我想让提供的对象实例(o1和o2)执行给定的方法。我发现Supplier是错误的接口,而我不得不使用Function。在这里,您可以看到我的工作简化示例:
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进行排序,因为主sorting属性在列表中可能不是唯一的。我想与您分享我的代码,因为我认为这对您可能是一个有趣的见解。
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;
}
例如,使用此功能,您可以按姓氏对人员列表进行排序,如果其中两个相同,则可以使用名字进行排序。使用此解决方案,您可以在运行时更改排序。
答案 3 :(得分:1)
您可以使用
Comparator.comparing(String::length);
获得一个比较器实例,您可以将其传递给该方法。