我正在測試在EL 3 spec中明確定義的lambda表達式的表達式語言支持。我有下面的測試情況下,使用Tomcat 8.0.30和鑽嘴魚科JSF 2.2.12:Tomcat的EL Stream API是否有意義?
test.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head />
<h:body>
<p>
<h:outputText
value="#{testBean.values.stream().anyMatch(str -> str == 'Test1')}" />
</p>
<p>
<h:outputText
value="#{testBean.values.stream().anyMatch(str -> str == 'Test1').get()}" />
</p>
<p>
<h:outputText
value="#{testBean.values.stream().anyMatch(str -> str == 'Test3').get()}" />
</p>
</h:body>
</html>
TestBean.java
@ManagedBean
@ViewScoped
public class TestBean {
private final List<String> values = Arrays.asList("Test1", "Test2");
public List<String> getValues() {
return values;
}
}
我已經發現,甚至EL表達式都支持EL,Tomcat流API在某種程度上與the Java's one(返回布爾值)有所不同,它返回an Optional。因此,所顯示的結果是這樣的:
[email protected]
true
false
同樣的情況,爲Stream#allMatch
和Stream#noneMatch
。
這是否有任何理由?
@ArnaudDenoyelle,來自Java 8 API,[它返回一個布爾值](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#anyMatch-java .util.function.Predicate-)。它實際上不是一個過濾器,而是一種檢查是否有任何匹配給定謂詞的方法。 –
因此,程序員在'anyMatch'處複製'findAny'的代碼。 _提交bugreport._並更好地使用'findAny.isPresent'。 –