我有一个列表,我想从列表中找到一个与谓词匹配的元素。我在列表中找到与第一个谓词匹配的元素,如果第一个谓词不返回true,则它与第二个谓词匹配。
以下是一个例子:
情况1:
result = iterable.tryFind(List, Predicates.or(predicate1, predicate2)).orNull();
这段代码的问题是它找到匹配任何谓词的第一个元素。即使列表中的第二个元素匹配第一个谓词,在我的情况下应该给予更高的优先级。在这种情况下,我期望结果在这里作为第二个元素,但是获得第一个元素(因为它是第一个元素)它匹配其中一个谓词)。
情况2:
result = iterable.tryFind(List, Predicates.and(predicate1, predicate2)).orNull();
如果第一个谓词返回false,这显然不起作用。
案例3:
result = iterable.tryFind(List, predicate1).orNull();
if(result == null)
result = iterable.tryFind(List, predicate2).orNull();
这对我有用,但它看起来很乱,并且无法实现函数式编程的目的。
有没有其他方法可以从列表中获取适用于我的场景的元素?
答案 0 :(得分:5)
您可以使用Optional.or
代替Predicate.or
来获得您想要的内容:
result = Iterables.tryFind(list, predicate1)
.or(Iterables.tryFind(list, predicate2))
.orNull();