2016-08-23 69 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

這是正確的。 –

相關問題