在前面的一些示例中,您已经看到我们使用方括号[]运算符从集合中选择项目。在此博客文章中,您将学习如何在使用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}