eTerables.find و eTerators.find - بدلاً من إلقاء الاستثناء ، احصل على NULL
سؤال
أنا أستخدم جوجل توصيلات وأحاول العثور على العنصر الأول الذي يرضي المسند إن لم يكن ، أعدني "لاغية".
لسوء الحظ ، يلقي eTerables.find و iterators.find nosuchelementException عند عدم العثور على عنصر.
الآن ، أنا مجبر على القيام به
Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
found = Iterators.find( newIterator(...), my_predicate )
}
يمكنني أن أحيط بـ "Try/Catch" والقيام بنفس الشيء ولكن بالنسبة لحالات الاستخدام الخاصة بي ، سأواجه العديد من الحالات التي يتم فيها العثور على أي عنصر.
هل هناك طريقة أبسط للقيام بذلك؟
المحلول
يبدو أنك يجب أن تستخدم التكرار.
نصائح أخرى
منذ جوافا 7 ، يمكنك القيام بذلك باستخدام الحمل الزائد لـ teerables.find () الذي يأخذ قيمة افتراضية:
Iterables.find(iterable, predicate, null);
تم تقديم هذا كطلب ميزة:
http://code.google.com/p/guava-libraries/issues/detail؟id=217
نحن في الواقع قيد التقدم في ذلك.
لست متأكدًا مما إذا كان هذا مؤهلاً أكثر بساطة ، ولكنه على الأقل يتجنب الاستثناءات ويتطلب تمريرة واحدة فقط على المصدر غير قابلة للإصابة:
public static <T> T findMatchOrNull(Iterator<T> source, Predicate<T> pred) {
Iterator<T> matching = Iterators.filter(source, pred);
Iterator<T> padded = Iterators.concat(matching, Iterators.<T>singletonIterator(null));
return padded.next();
}