2016-08-23 71 views
2

我正在测试在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#allMatchStream#noneMatch

这是否有任何理由?

+0

@ArnaudDenoyelle,来自Java 8 API,[它返回一个布尔值](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#anyMatch-java .util.function.Predicate-)。它实际上不是一个过滤器,而是一种检查是否有任何匹配给定谓词的方法。 –

+0

因此,程序员在'anyMatch'处复制'findAny'的代码。 _提交bugreport._并更好地使用'findAny.isPresent'。 –

回答

3

EL 3.0 Stream API在Java 8 Stream API之前完成。虽然努力使它们保持同步,但存在差异。这是其中之一。

+0

很高兴知道。我想没有计划将它与Java Stream同步,因为它会打破向后兼容性?谢谢! –

+0

这是正确的。 –

相关问题