2016-08-23 1 views
2

Ich teste die Expression Language-Unterstützung für Lambda-Ausdrücke, die in der EL 3 spec gut definiert ist. Ich habe den folgenden Testfall bekam, mit Tomcat 8.0.30 und Mojarra JSF 2.2.12:Macht Tomcat's EL Stream API Sinn?

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; 
    } 

} 

I habe festgestellt, dass sogar die Lambda-Ausdrücke von EL unterstützt werden, die Tomcat-Stream-API unterscheidet sich in gewisser Weise durch the Java's one (die boolean zurückgibt) und es gibt an Optional zurück. Also das angezeigte Ergebnis ist folgendes:

[email protected] 

true 

false 

Das gleiche gilt für Stream#allMatch und Stream#noneMatch geschieht.

Gibt es einen Grund dafür?

+0

@ArnaudDenoyelle, von der Java 8 API, [es gibt einen booleschen Wert zurück] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#anyMatch-java .util.function.Predicate-). Es ist nicht wirklich ein Filter, sondern eine Möglichkeit zu überprüfen, ob einer von ihnen dem gegebenen Prädikat entspricht. –

+0

So irgendwo kopiert ein Programmierer den Code für 'findAny' bei' anyMatch'. _Senden Sie einen Fehlerbericht._ Und besser verwenden Sie 'findAny.isPresent'. –

Antwort

3

Die EL 3.0-Stream-API wurde vor der Java 8 Stream-API finalisiert. Während Anstrengungen unternommen wurden, um sie synchron zu halten, gibt es Unterschiede. Dies ist einer von ihnen.

+0

Gut zu wissen. Ich nehme an, es gibt keine Pläne, es mit Java Stream zu synchronisieren, da es die Rückwärtskompatibilität brechen würde? Vielen Dank! –

+0

Das ist richtig. –