Что в этом плохого?
List<Supplier> supplierList = //somehow get the list
Supplier s = Iterables.find(supplierList, new Predicate<Supplier>(){
boolean apply(Supplier supplier) {
return supplier.isSomeMethodCall() == null;
}
boolean equals(Object o) {
return false;
}
});
Вы пытаетесь сохранить некоторые строки? Единственная оптимизация, о которой я могу думать, - это статический импорт находки, чтобы вы могли избавиться от «Итераторов». Кроме того, предикат является анонимным внутренним классом, если вам это нужно в более чем одном месте вы можете создать класс, и это будет выглядеть так,
List<Supplier> supplierList = //somehow get the list
Supplier s = find(supplierList, new SupplierPredicateFinder());
Где SupplierPredicateFinder другой класс.
ОБНОВЛЕНИЕ: В этом случае поиск является неправильным методом. Вам действительно нужна такая настраиваемая функция, которая может вернуть два значения. Если вы используете коллекцию commons, вы можете использовать DefaultMapEntry или просто можете вернуть объект [2] или Map.Entry.
public static DefaultMapEntry getSupplier(List<Supplier> list) {
for(Supplier s : list) {
Object heavyObject = s.invokeCostlyMethod();
if(heavyObject != null) {
return new DefaultMapEntry(s, heavyObject);
}
}
}
Заменить DefaultMapEntry со списком размером 2 или HashMap размера 1 или массив длиной 2 :)
+1 для ответа на вопрос, который задал хорошо. Тем не менее, я думаю, что заданный вопрос должен был быть «что это лучший способ сделать это», а не «что такое способ, который использует коллекции Google», поэтому я предложил еще один ответ. –
Это работало для меня. – pledge
Тогда вы должны принять это как ответ. – harschware