3 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是您正在尋找的內(nèi)容(我相信):
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貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
感謝您的回答。其實(shí)我現(xiàn)在想通了。我想要提供的對(duì)象實(shí)例(o1 和 o2)來執(zhí)行給定的方法。我發(fā)現(xiàn)供應(yīng)商是錯(cuò)誤的接口,而我不得不使用函數(shù)。在這里你可以看到我的工作簡(jiǎn)化示例:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter) {
return getter.apply(o1).compareTo(getter.apply(o2));
}
接口必須是Function 而不是Supplier 的原因是,只有Function 等價(jià)于使用對(duì)象并調(diào)用對(duì)象上的引用方法的lambda 表達(dá)式。
例如,如果您將方法引用定義為:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
那么正在執(zhí)行的等效 lambda 表達(dá)式是:
(instance) -> instance.referencedMethod()
附加信息:
編輯:我知道我可以通過使用 Comparator 來做同樣的事情,但這個(gè)例子非常簡(jiǎn)化。在我的應(yīng)用程序中,這種功能是必要的。我必須創(chuàng)建一個(gè) compareTo 函數(shù),該函數(shù)按多個(gè)屬性對(duì) ArrayList 進(jìn)行排序,因?yàn)橹饕判驅(qū)傩栽诹斜碇锌赡懿皇俏ㄒ坏摹N蚁肱c您分享我的代碼,因?yàn)槲艺J(rèn)為這對(duì)您來說可能是一個(gè)有趣的見解。
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;
}
例如,您可以按姓氏對(duì)人員列表進(jìn)行排序,如果其中兩個(gè)相同,則可以使用名字進(jìn)行排序。使用此解決方案,您可以在運(yùn)行時(shí)更改排序。

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
實(shí)際上,定義方法的更正確方法是:
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);
}
添加回答
舉報(bào)