Java如何使用Spring EL根据某些条件过滤集合成员?

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