我正在测试lambda表达式的表达式语言支持,这种表达式在EL 3 spec中得到了很好的定义。我有以下测试用例,使用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;
}
}
我发现,即使是EL支持lambda表达式,Tomcat流API也会以某种方式与the Java's one(返回boolean)不同,并返回an Optional。所以显示的结果如下:
org.apache.el.stream.Optional@66a02a04
true
false
Stream#allMatch
和Stream#noneMatch
也是如此。
这有什么理由吗?
答案 0 :(得分:3)
EL 3.0 Stream API在Java 8 Stream API之前完成。虽然我们努力使它们保持同步,但也存在差异。这是其中之一。