我目前正面临代码可读性问题。问题如下:
有三个对象
// 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);
我知道guava提供内置谓词,如isNull
和notNull
。
有没有办法实现满足这两个布尔值的自定义谓词? (假设.apply(..)
函数将接受3个参数)
答案 0 :(得分:4)
我不确定你想要什么,但答案很可能是:是的,但这没什么意义。
您可以使用
FluentIterable<Object> it =
FluentIterable.from(Lists.newArrayList(obj1, obj2, obj3));
boolean allNull = it.allMatch(Predicates.isNull());
boolean anyNull = it.anyMatch(Predicates.isNull());
但要确保它的可读性和普通方式都要慢得多,而且要慢得多。
答案 1 :(得分:0)
显然你坚持使用Predicate
s,这在你的用例中毫无意义。所以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));
答案 2 :(得分:0)
易于在普通Java 8中实现:
/**
* Check that <b>at least one</b> of the provided objects is not null
*/
@SafeVarargs
public static <T>
boolean anyNotNull(T... objs)
{
return anySatisfy(Objects::nonNull, objs);
}
/**
* Check that <b>at least one</b> of the provided objects satisfies predicate
*/
@SafeVarargs
public static <T>
boolean anySatisfy(Predicate<T> predicate, T... objs)
{
return Arrays.stream(objs).anyMatch(predicate);
}
/**
* Check that <b>all</b> of the provided objects satisfies predicate
*/
@SafeVarargs
public static <T>
boolean allSatisfy(Predicate<T> predicate, T... objs)
{
return Arrays.stream(objs).allMatch(predicate);
}
//... other methods are left as an exercise for the reader
(请参见what and why @SaveVarargs)
用法:
// all are null
final boolean allNulls1 = !anyNotNull(obj1, obj2, obj3);
final boolean allNulls2 = allSatisfy(Objects::isNull, obj1, obj2, obj3);
// any of them is null
final boolean hasNull = anySatisfy(Objects::isNull, obj1, obj2, obj3);
P.S。新手程序员的一般注意事项。番石榴是一个很棒的库,但是如果您只想只,因为它又小又简单(比如这个,或Strings.isNullOrEmpty
等),IMO对于您的项目来说,实施自己动手,避免过度依赖。