3 回答

TA貢獻1830條經(jīng)驗 獲得超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

TA貢獻1827條經(jīng)驗 獲得超8個贊
感謝您的回答。其實我現(xiàn)在想通了。我想要提供的對象實例(o1 和 o2)來執(zhí)行給定的方法。我發(fā)現(xiàn)供應商是錯誤的接口,而我不得不使用函數(shù)。在這里你可以看到我的工作簡化示例:
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();
那么正在執(zhí)行的等效 lambda 表達式是:
(instance) -> instance.referencedMethod()
附加信息:
編輯:我知道我可以通過使用 Comparator 來做同樣的事情,但這個例子非常簡化。在我的應用程序中,這種功能是必要的。我必須創(chuàng)建一個 compareTo 函數(shù),該函數(shù)按多個屬性對 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;
}
例如,您可以按姓氏對人員列表進行排序,如果其中兩個相同,則可以使用名字進行排序。使用此解決方案,您可以在運行時更改排序。

TA貢獻1951條經(jīng)驗 獲得超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);
}
添加回答
舉報