如何在EL Stream API中使用Collectors#join?

问题描述 投票:0回答:1

我正在尝试在JSP中打印列表的内容,作为由逗号分隔的单个字符串。

<div>${myList.stream().map(e->e.getStringValue()).collect(Collectors.joining(", "))}</div>

我收到错误:

javax.el.MethodNotFoundException: Method not found: class org.apache.el.stream.Stream.collect(null)

为什么Tomcat使用它自己的Stream版本?有没有办法避免这种情况,并确保我在java类中编写的内容在JSP中放入EL时会有相同的行为?

我发现这个答案https://stackoverflow.com/a/42930628/2761418但它并没有解决我的问题。它使用Tomcat Streams的自定义方法。

tomcat java-stream el
1个回答
4
投票

EL Stream API与Jav​​a 8的Stream API无关。 EL流API是一个完全独立的API,最初是为Java 7开发的,它与Java 7绑定。请注意,这确实意味着在使用EL Stream API时根本不需要Java 8,它已经可以工作了在Java 7上。

从历史上看,EL规范领导者试图设计EL Stream API,就像当时已知的Java 8的Stream API提案一样。不幸的是,EL Stream#join()已经滑落,因为Collectors#joining()后来才被添加。

在任何情况下,您都不能在EL Stream方法中使用任何Java 8的Stream API函数,例如Collectors#xxx()。如上所述,EL Stream API完全是独立的。为了收集EL流,只有Stream#toArray()Stream#toList()Stream#reduce()方法可用。另见Java EE教程中的“Operations on Collection Objects”一章和EL 3.0 specification的第2.3章“集合操作”。

因此,在EL Stream API中,通过加入字符串或任何其他自定义收集器来收集流的最佳选择是使用Stream#reduce()。以下是您具体案例的示例:

<div>${myList.stream().map(e -> e.stringValue).reduce((l, r) -> l += ', ' += r).get()}</div>

请注意,我借此机会将${e.getStringValue()}简化为${e.stringValue},因为它基本上代表EL中的bean属性。

© www.soinside.com 2019 - 2024. All rights reserved.