在前面的一些示例中,您已经看到我们使用方括号[]运算符从集合中选择项目。在此博客文章中,您将学习如何在使用Spring EL时按特定条件过滤集合的某些成员。为此,Spring EL为您提供了另一个特殊的运算符,即filter运算符,可以将其键入为.?[]。您可以在其中定义括号内的过滤条件。
除了过滤器运算符外,.?[]>还有运算符可以从集合中选择第一个和最后一个匹配项。您可以分别使用.^[]和和.$[]运算符从集合中选择最后一个匹配项。
作为示例,我们将在此处演示我们想要找到具有250页以上页面的书籍集合并将其分配给Librarybean的books属性。因此,让我们首先定义称为类Book和Library将具有以下特性:
package org.nhooo.example.spring.el; public class Book { private Long id; private String title; private String author; private String type; private int pages; // Getters & Setters @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", author='" + author + '\'' + ", pages=" + pages + '}'; } }
package org.nhooo.example.spring.el; import java.util.List; public class Library { private List<Book> books; public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } }
创建Book和Library类之后,现在让我们为演示创建Spring配置文件。我们将创建一个文件,并spel-select-collection.xml按照以下配置行进行调用。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <util:list id="books"> <bean p:title="Essential C# 4.0" p:author="Michaelis" p:pages="450"/> <bean p:title="User Stories Applied" p:author="Mike Cohen" p:pages="268"/> <bean p:title="Learning Android" p:author="Marco Gargenta" p:pages="245"/> <bean p:title="The Ruby Programming Language" p:author="David Flanagan & Yukihiro Matsumoto" p:pages="250"/> <bean p:title="Einstein" p:author="Walter Isaacson" p:pages="1000"/> </util:list> <bean id="lib1"> <property name="books" value="#{books.?[pages gt 250]}"/> </bean> <bean id="lib2"> <property name="books" value="#{books.^[pages gt 250]}"/> </bean> <bean id="lib3"> <property name="books" value="#{books.$[pages gt 250]}"/> </bean> </beans>
您可以在上面的配置中看到的第一件事是<util-list>我们创建Bookbean列表的位置。接下来,我们对类型的三个bean进行定义,在该类型中Library,为books属性分配了从books列表中选择的bean集合。
lib1遗嘱包含页数超过250的书籍。遗嘱包含发现页数超过250lib2的第一本书,而lib3遗嘱包含发现书页超过250的最后一本书。
下面的代码将运行我们的配置文件,并生成示例输出。
package org.nhooo.example.spring.el; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpELFilterCollection { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spel-filter-collection.xml"); System.out.println("Library 1"); Library lib1 = (Library) context.getBean("lib1"); for (Book book : lib1.getBooks()) { System.out.println(" Book = " + book); } System.out.println("Library 2"); Library lib2 = (Library) context.getBean("lib2"); for (Book book : lib2.getBooks()) { System.out.println(" Book = " + book); } System.out.println("Library 3"); Library lib3 = (Library) context.getBean("lib3"); for (Book book : lib3.getBooks()) { System.out.println(" Book = " + book); } } }
Library 1 Book = Book{title='Essential C# 4.0', author='Michaelis', pages=450} Book = Book{title='User Stories Applied', author='Mike Cohen', pages=268} Book = Book{title='Einstein', author='Walter Isaacson', pages=1000} Library 2 Book = Book{title='Essential C# 4.0', author='Michaelis', pages=450} Library 3 Book = Book{title='Einstein', author='Walter Isaacson', pages=1000}