第一步是使用Stream#allMatch(Predicate) 检查元组中[foo, bar] 或 [bar, baz] 和元组大小的组合。
在第二步中,我已将内部数组转换为 Set<String>,这样可以轻松解决 [foo, foo] 之类的情况,因为重复项将被删除,而且我们可以使用 Set.contains() 进行 O(1) 查找检查[foo, bar] 或 [bar, baz] 是否存在于元组流中:
class TupleTest {
@org.junit.jupiter.api.Test
void testTupleOfCandidates_True() {
Stream<String[]> candidates = Stream.of(new String[]{"bar", "foo"}, new String[]{"bar", "baz"});
assertTrue(isCandidateStreamValid(candidates));
candidates = Stream.of(new String[]{"bar", "foo"}, new String[]{"bar", "baz"});
assertTrue(isCandidateStreamValid(candidates));
}
@org.junit.jupiter.api.Test
void testTupleOfCandidates_False() {
Stream<String[]> candidates = Stream.of(new String[]{"foo", "foo"}, new String[]{"bar", "baz"});
assertFalse(isCandidateStreamValid(candidates));
candidates = Stream.of(new String[]{"bar", "foo"}, new String[]{"bar", "baz"}, new String[]{"baz", "bar"});
assertTrue(isCandidateStreamValid(candidates));
}
public boolean isCandidateStreamValid(Stream<String[]> candidates){
return candidates.allMatch(arr -> {
Set<String> data = new HashSet(Arrays.asList(arr));
return data.size() == 2
&&
((data.contains("foo") && data.contains("bar"))
||
(data.contains("bar") && data.contains("baz")));
});
}
}