2014-02-21 191 views
0

讓我們定義的Person列表作爲最小/最大

  • 名稱
  • 年齡

我想最大(年齡)在List<Person>

我可以遍歷這個名單上,手動保持最大:

Integer max = null; 
for(Person p : list) { 
    if(max == null || max < p.getAge()) { 
    max = p.getAge(); 
    } 
    return max; 
} 

但我覺得有可能存在的番石榴方法可以做到這一點對我的組合。如果我寫一個Function<Person, Integer>,是否有一個現成的方法來從列表中獲取最大值?

+0

嗯,什麼是'age'?我認爲這是一個'整型',但爲什麼不把它變成'int'? – fge

+0

我喜歡對象,因爲它們可以爲null。如果年齡沒有填滿,我寧願得到一個NPE(並且被迫在DB中增加一個約束)而不是0。 –

+0

嗯,好的...但是爲什麼不強制代碼插入一個值地點?提示:空列,你如何可靠地使用'NOT IN'? – fge

回答

4

請參閱this答案。您可以使用Ordering.max()

Ordering<People> o = new Ordering<People>() { 
    @Override 
    public int compare(People left, People right) { 
     return Ints.compare(left.getAge(), right.getAge()); 
    } 
}; 

return o.max(list); 
+0

工程就像一個魅力,謝謝你:)。 –

1

你可以用番石榴做到這一點,但我認爲它會出來比一個更清潔的版本的解決方案,即更令人費解:

int max = -1; 

for (People p : list) { 
    if (p.getAge() > max) 
     max = p.getAge(); 
} 

順便說一句,這可能更有意義調用您的類Person,因爲它代表單個,而不是一組

1

如果你有一個Function<Person, Integer>(稱爲getAge,說),這也只是:

Integer maxAge = Ordering.natural().max(Iterables.transform(people, getAge));