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?
@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. –
So irgendwo kopiert ein Programmierer den Code für 'findAny' bei' anyMatch'. _Senden Sie einen Fehlerbericht._ Und besser verwenden Sie 'findAny.isPresent'. –