Phi*_*säß 11 java method-reference
如何将Java绑定Supplier到Object的现有实例?例如,如果我想compareTo()用这个标题编写我自己的方法:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) {...}
Run Code Online (Sandbox Code Playgroud)
我想能够称之为:
myCompareTo("Hello", "Hello2", String::length);
Run Code Online (Sandbox Code Playgroud)
where String(带大写字母)是一个类而没有对象.那么如何将实例绑定o1到供应商?
感谢您的回答。其实我现在已经明白了。我想要提供的对象实例(o1 和 o2)来执行给定的方法。我发现供应商是错误的接口,而我必须使用函数。在这里您可以看到我的工作简化示例:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter) {
return getter.apply(o1).compareTo(getter.apply(o2));
}
Run Code Online (Sandbox Code Playgroud)
接口必须是Function 而不是Supplier 的原因是,只有Function 相当于接受一个对象并调用该对象上引用的方法的lambda 表达式。
例如,如果您将方法引用定义为:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
Run Code Online (Sandbox Code Playgroud)
那么正在执行的等效 lambda 表达式是:
(instance) -> instance.referencedMethod()
Run Code Online (Sandbox Code Playgroud)
附加信息:
编辑:我知道我可以使用比较器完成相同的操作,但这个示例非常简化。在我的应用程序中,这种功能是必要的。我必须创建一个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;
}
Run Code Online (Sandbox Code Playgroud)
例如,您可以按姓氏对人员列表进行排序,如果其中两个相同,则可以使用名字进行排序。使用此解决方案,您可以在运行时更改排序。
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |