Что с этим не так?
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;
}
});
Вы пытаетесь сохранить некоторые строки? Единственная оптимизация, о которой я могу подумать, - это статический импорт поиска, чтобы вы могли избавиться от «Iterables». Также предикат является анонимным внутренним классом, если он вам нужен более чем в одном месте, вы можете создать класс, и он будет выглядеть так:
List<Supplier> supplierList = //somehow get the list
Supplier s = find(supplierList, new SupplierPredicateFinder());
Где SupplierPredicateFinder - другой класс.
ОБНОВЛЕНИЕ: в этом случае поиск является неправильным методом. На самом деле вам нужна такая функция, которая может возвращать два значения. Если вы используете commons-collection, тогда вы можете использовать DefaultMapEntry или просто вернуть Object [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 или хеш-картой размера 1 или массивом длины 2:)