2

現在、コードの可読性の問題に直面しています。問題は次のとおりです。

3つのオブジェクトを持つ

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

次のように、それらから2つのブール値を作成したい:

// 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

これら 2 つのブール値を満たすカスタム述語を実装する方法はありますか? .apply(..)(その関数が3つのパラメータを取ると仮定すると)

4

3 に答える 3

4

あなたが何を望んでいるのかはわかりませんが、答えはおそらく「はい、しかしほとんど意味がありません」です。

使用できます

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

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

ただし、通常の方法で行うよりもはるかに読みにくく、はるかに遅くなりますのでご安心ください。

于 2014-02-11T12:44:52.323 に答える
0

どうやらあなたは s を持つことを主張しているようですが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));
于 2014-02-11T13:25:04.083 に答える