2014-02-11 4 views
0

В настоящее время я сталкиваюсь с проблемой удобочитаемости кода. Проблема заключается в следующем:Все Null, Any Null возможно guava Predicate

Есть три объекта

// initialization skipped, all of three could be null as result of their initalization 
Object obj1; 
Object obj2; 
Object obj3; 

Я хочу создать две булевы из них следующим образом:

// all are null 
boolean bool1 = (obj1 == null && obj2 == null && obj3 == null); 

// any of them is null 

boolean bool2 = (obj1 == null || obj2 == null || obj3 == null); 

Я знаю, гуавы предоставляет встроенные предикаты как isNull и notNull ,

Есть ли способ реализовать пользовательский предикат, который выполняет эти два булина? (при условии, что функция .apply(..) будет принимать 3 параметра)

+0

вам нужна [предпосылка] Do (https://code.google.com/p/guava-libraries/wiki/PreconditionsExplained) или [предикат] (https: //code.google.com/p/guava-libraries/wiki/FunctionalExplained#Predicates)? Оба они разные. –

+0

Мне нужна реализация предикатов с двумя методами, которые будут охватывать эти два булина. – px5x2

+0

Этот вопрос не прав: вам нужен 3-параметр 'Predicate', где существует только один (вы можете использовать списки, чтобы соответствовать этому). Вы хотите убить муху с помощью bazooka, так как ваш код отлично читается и имеет полный смысл; нет необходимости использовать Guava. Наконец, вы хотите использовать 'Predicate' без всякой причины. Я дам ответ, который будет отвечать строго на ваш вопрос, но это все еще не имеет смысла. –

ответ

3

Я не уверен, что вы хотите, но, скорее всего, ответ: Да, но это мало смысла.

Вы можете использовать

FluentIterable<Object> it = 
    FluentIterable.from(Lists.newArrayList(obj1, obj2, obj3)); 

boolean allNull = it.allMatch(Predicates.isNull()); 
boolean anyNull = it.anyMatch(Predicates.isNull()); 

, но будьте уверены, что это и гораздо менее читабельным и гораздо медленнее, чем делать это обычным способом.

0

Видимо, вы настаиваете на том, чтобы иметь Predicate с, что совершенно не имеет смысла в вашем случае использования. Поэтому ответ maaartinus правильный, но не дает ответа предикатов. Вот решение с предикатами.

Predicate<Iterable<?>> anyIsNull = new Predicate<Iterable<?>>() { 
    @Override public boolean apply(Iterable<?> it) { 
     return Iterables.any(it, Predicates.isNull()); 
    } 
}; 

Predicate<Iterable<?>> allAreNull = new Predicate<Iterable<?>>() { 
    @Override public boolean apply(Iterable<?> it) { 
     return Iterables.all(it, Predicates.isNull()); 
    } 
}; 

Использование:

bool1 = anyIsNull.apply(Arrays.asList(obj1, obj2, obj3)); 
bool2 = allAreNull.apply(Arrays.asList(obj1, obj2, obj3)); 
Смежные вопросы