我想通過2個串列進行迭代并找到一個值。我想把這些函式合并成一個函式,但不確定是否可行。這可以做到嗎? List<Student >的迭代看起來像
。for(Student student : studentList){
if (obj.value() == -1) {
return obj.value()。
}
List< Teacher > 的迭代看起來像
for(Teacher teacher : teacherList){
if (obj.val() == -1) {
return obj.value()。
}
注意:物件A和B的函式檢索了相同的值,但它們有不同的函式名稱,因此是.val()對.value()
。這些函式可以合并為一個嗎?
uj5u.com熱心網友回復:我假設你不能修改Teacher和Student類,并使它們實作一個共同的介面(或擴展一個共同的類),其中有val / value方法。 如果你可以,那么就這樣做吧。
你可以使用generics來為你處理這個問題。 一個
Function應該涵蓋你在這里要做的事情:
public <T, P> T get(final Collection< P> people。
final ToIntFunction<P> valGetter,
final Function<P, T> resultGetter) {
for (final P person : people) {
if (valGetter.applyAsInt(person) == -1) {
return resultGetter.apply(person)。
}
}
// I don't know, do something? 拋出?
return null。
}
然后用這樣的方式呼叫它:
final List<Student> students = new ArrayList<> ()。
get(students, Student::value, Student::name)。
final List<Teacher> teachers = new ArrayList<> ()。
get(teachers, Teacher::val, Teacher::name)。
ToIntFunction將接收一個通用型別的元素,并回傳一個int。 所以對于Student,我們只需使用Student::value,而對于Teacher,使用Teacher::val。
我無法判斷obj.value();的結果是否是相同的型別,或者來自兩種型別上的一個共同的介面。 如果是這樣,那么你可以在泛型部分添加<T, P extends CommonType>,然后直接從那里呼叫.value()。 上面的答案假設它沒有,所以resultGetter Function被用來將你的人物型別(Teacher或Student)轉換成該類所給出的任何結果型別。 在上面的例子中,我使用了::name,但是可以用你想從其中提取的任何屬性來替換它。
最后,處理那些沒有匹配的情況...... 我不知道什么適合你的情況,但是拋出新的...例外或回傳null似乎是兩個最可能的候選。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330170.html
標籤:
下一篇:遞回強型別函式的型別化
