查找匹配谓词并使用iterable.tryFind从java中的列表返回元素

查找匹配谓词并使用iterable.tryFind从java中的列表返回元素,java,guava,Java,Guava,我有一个列表,我希望列表中的元素与谓词匹配。我从列表中找到一个与第一个谓词匹配的元素,如果第一个谓词没有返回true,它将与第二个谓词匹配 以下是一个例子: 案例1: result = iterable.tryFind(List, Predicates.or(predicate1, predicate2)).orNull(); 这段代码的问题在于它找到了第一个匹配这些谓词的元素。即使列表中的第二个元素与第一个谓词匹配,在我的例子中,第一个谓词应该具有更高的优先级。在这种情况下,我希望这里的结果

我有一个列表,我希望列表中的元素与谓词匹配。我从列表中找到一个与第一个谓词匹配的元素,如果第一个谓词没有返回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();
这对我来说是可行的,但它看起来很混乱,并且违背了函数式编程的目的


是否有其他方法可以从列表中获取适用于我的场景的元素?

您可以使用
可选。或
而不是
谓词。或
来获取所需内容:

result = Iterables.tryFind(list, predicate1)
         .or(Iterables.tryFind(list, predicate2))
         .orNull();

仅仅因为你有分支,它就真的不能达到目的吗?什么困扰着你:分支,双重迭代,还有其他什么?通过映射而不是过滤,您可以通过一次迭代获得结果,这样您就知道哪个谓词匹配,过滤与任何谓词都不匹配的元素,然后减少以保持第一个匹配,并从第一个谓词中为匹配赋予优先级。(在Java中)它真的会变得不那么凌乱吗?@FrankPavageau:分支让我很烦恼。我希望它在不分离谓词的情况下工作。如果我理解正确的话,你建议的方法将与此类似。我想这是我唯一能让它工作的方法。我不认为“函数编程”意味着删除所有控制流:在某个点上必须做一些事情,当你过滤一个集合时,它只是隐藏在方法中,未删除。问题是总是对
Iterables.tryFind(list,predicate2)
进行求值。您需要Javascript中的
|
或LISP中的
。在Java中,只有当
tryFind
是惰性的并且
Optional
在需要时会计算其参数时,它才能工作。这是我的解决方案的缺点。lazy
tryFind
可以通过
供应商实现,但只有当它不返回
缺席时才有效。