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

Lif*_*rld 5 java guava

我有一个列表,我想从列表中找到一个与谓词匹配的元素.我在列表中找到了与第一个谓词匹配的元素,如果第一个谓词没有返回true,则它与第二个谓词匹配.

这是一个例子:

情况1:

result = iterable.tryFind(List, Predicates.or(predicate1, predicate2)).orNull();
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是它找到了匹配任何谓词的第一个元素.即使列表中的第二个元素匹配第一个谓词,在我的情况下应该给予更高的优先级.在这种情况下,我期望结果在这里作为第二个元素,但获得第一个元素(因为它是第一个元素)它匹配其中一个谓词).

案例2:

result = iterable.tryFind(List, Predicates.and(predicate1, predicate2)).orNull();
Run Code Online (Sandbox Code Playgroud)

如果第一个谓词返回false,这显然不起作用.

案例3:

result = iterable.tryFind(List, predicate1).orNull();

if(result == null)
result = iterable.tryFind(List, predicate2).orNull();
Run Code Online (Sandbox Code Playgroud)

这对我有用,但它看起来很乱,并且破坏了函数式编程的目的.

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

phl*_*tos 5

您可以使用Optional.or而不是Predicate.or获得您想要的东西:

result = Iterables.tryFind(list, predicate1)
         .or(Iterables.tryFind(list, predicate2))
         .orNull();
Run Code Online (Sandbox Code Playgroud)

  • 问题是始终评估`Iterables.tryFind(list,predicate2)`.你需要来自Javascript的`||`或来自LISP的`或`.在Java中,它只能在`tryFind`是懒惰的时候工作,而`Optional`会在需要时评估它的参数. (2认同)