我正在测试对EL 3 spec中定义好的lambda表达式的表达式语言支持。我有以下测试用例,使用的是Tomcat 8.0.30和Mojarra JSF 2.2.12:
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;
}
}
我发现,即使lambda表达式也受EL支持,Tomcat流API与the Java's one在某种程度上有所不同(返回boolean),并且返回an Optional。所以显示的结果是这样的:
org.apache.el.stream.Optional@66a02a04
true
false
Stream#allMatch
和Stream#noneMatch
也会发生同样的情况。有什么理由吗?
最佳答案
EL 3.0 Stream API在Java 8 Stream API之前已完成。在努力使它们保持同步的同时,也存在差异。这就是其中之一。