Java 使用Spring集合选择的并集和交集

Java 使用Spring集合选择的并集和交集,java,spring,Java,Spring,Spring能够通过ExpressionParser(集合选择)返回集合的子集 例如,想象一个简单的类: public Customer { private String name; private boolean vip; private boolean conferenceAttendee; } 如果我有一个以前设置为StandardEvaluationContext变量的List集合:evalContext.setVariable(“customerList”,custome

Spring能够通过
ExpressionParser
(集合选择)返回集合的子集

例如,想象一个简单的类:

public Customer {
  private String name;
  private boolean vip;
  private boolean conferenceAttendee;
}
如果我有一个以前设置为
StandardEvaluationContext
变量的
List
集合:
evalContext.setVariable(“customerList”,customers)我可以通过“选择表达式”
?[]
,检索vip为真的所有客户的子集:


我特别想了解与其他类似的解决方案相比,我可以将哪些有效的选择表达式传递给SpelExpressionParser的parseExpression。

您非常接近。您可以使用以下选项:

    customerList.add(new Customer("jim", true, false));
    customerList.add(new Customer("bob", false, true));
    customerList.add(new Customer("rob", true, true));

    List<Customer> vipCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip]")
                    .getValue(evalContext);
    System.out.println(vipCustomers);
    //[Customer{name='jim'}, Customer{name='rob'}]

    List<Customer> vipANDConfAttendeesCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip and conferenceAttendee]")
                    .getValue(evalContext);
    System.out.println(vipANDConfAttendeesCustomers);
    //[Customer{name='rob'}]        

    List<Customer> vipORConfAttendeesCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip or conferenceAttendee]")
                    .getValue(evalContext);
    System.out.println(vipORConfAttendeesCustomers);
    //[Customer{name='jim'}, Customer{name='bob'}, Customer{name='rob'}]        
以下是一些自动生成的equals/hashcode/toString方法的完整工作示例,这些方法基于一个假设,即名称是唯一标识客户的名称:

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;

public class GuavaTest {

    public static void main(String ...args){

        Predicate<Customer> isVip = new Predicate<Customer>() {
            @Override
            public boolean apply(Customer customer) {
                return customer.isVip();
            }
        };

        Predicate<Customer> isConferenceAttendee = new Predicate<Customer>() {
            @Override
            public boolean apply(Customer customer) {
                return customer.isConferenceAttendee();
            }
        };

        List<Customer> customers = Lists.newArrayList();

        customers.add(new Customer("jim",true,false));
        customers.add(new Customer("bob",false,true));
        customers.add(new Customer("rob",true,true));

        System.out.println("Vips:\t"+Iterables.filter(customers, isVip));
        System.out.println("Vips && ConfAttendees:\t"+Iterables.filter(customers, Predicates.and(isVip,isConferenceAttendee)));
        System.out.print("Vips || ConfAttendees:\t"+Iterables.filter(customers, Predicates.or(isVip,isConferenceAttendee)));
    }
}

class Customer {
 private String name;
 private boolean vip;
 private boolean conferenceAttendee;

    Customer(String name, boolean vip, boolean conferenceAttendee) {
        this.name = name;
        this.vip = vip;
        this.conferenceAttendee = conferenceAttendee;
    }

    public String getName() {
        return name;
    }

    public boolean isVip() {
        return vip;
    }

    public boolean isConferenceAttendee() {
        return conferenceAttendee;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Customer customer = (Customer) o;

        if (name != null ? !name.equals(customer.name) : customer.name != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                '}';
    }
}
import com.google.common.base.Predicate;
导入com.google.common.base.谓词;
导入com.google.common.collect.Iterables;
导入com.google.common.collect.list;
导入java.util.ArrayList;
导入java.util.List;
公共类GuavaTest{
公共静态void main(字符串…参数){
谓词isVip=新谓词(){
@凌驾
公共布尔应用(客户){
返回customer.isVip();
}
};
谓词isConferenceAttendee=新谓词(){
@凌驾
公共布尔应用(客户){
return customer.isConferenceAtEndee();
}
};
List customers=Lists.newArrayList();
添加(新客户(“jim”,真,假));
添加(新客户(“bob”,false,true));
添加(新客户(“rob”,true,true));
System.out.println(“Vips:\t”+Iterables.filter(customers,isVip));
System.out.println(“贵宾和与会者:\t”+Iterables.filter(客户、谓词和(isVip、isconferenceateatentendee));
System.out.print(“VIP | |与会者:\t”+Iterables.filter(客户、谓词或(isVip、ISConferenceateAttendee));
}
}
类客户{
私有字符串名称;
私人贵宾;
私人布尔会议与会者;
客户(字符串名称、布尔vip、布尔conferenceAttendee){
this.name=名称;
this.vip=vip;
this.conferenceAttendee=conferenceAttendee;
}
公共字符串getName(){
返回名称;
}
公共布尔值isVip(){
返回vip;
}
公共布尔值IsConferenceAtEndee(){
返回会议与会者;
}
@凌驾
公共布尔等于(对象o){
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
客户=(客户)o;
如果(name!=null?!name.equals(customer.name):customer.name!=null)返回false;
返回true;
}
@凌驾
公共int hashCode(){
返回名称!=null?name.hashCode():0;
}
@凌驾
公共字符串toString(){
返回“客户{”+
“name=”+name+“\”+
'}';
}
}

我很感谢您的回复,不过对于这种特殊情况,我确实需要了解SpelExpressionParser的parseExpression的功能限制。谢谢您的详细回答!
    customerList.add(new Customer("jim", true, false));
    customerList.add(new Customer("bob", false, true));
    customerList.add(new Customer("rob", true, true));

    List<Customer> vipCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip]")
                    .getValue(evalContext);
    System.out.println(vipCustomers);
    //[Customer{name='jim'}, Customer{name='rob'}]

    List<Customer> vipANDConfAttendeesCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip and conferenceAttendee]")
                    .getValue(evalContext);
    System.out.println(vipANDConfAttendeesCustomers);
    //[Customer{name='rob'}]        

    List<Customer> vipORConfAttendeesCustomers =
            (List<Customer>)new SpelExpressionParser()
                    .parseExpression("#customerList.?[vip or conferenceAttendee]")
                    .getValue(evalContext);
    System.out.println(vipORConfAttendeesCustomers);
    //[Customer{name='jim'}, Customer{name='bob'}, Customer{name='rob'}]        
    Predicate<Customer> isVip = new Predicate<Customer>() {
        @Override
        public boolean apply(Customer customer) {
            return customer.isVip();
        }
    };

    Predicate<Customer> isConferenceAttendee = new Predicate<Customer>() {
        @Override
        public boolean apply(Customer customer) {
            return customer.isConferenceAttendee();
        }
    };
Iterables.filter(customers, isVip);
Iterables.filter(customers, Predicates.and(isVip,isConferenceAttendee));
Iterables.filter(customers, Predicates.or(isVip,isConferenceAttendee));
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;

public class GuavaTest {

    public static void main(String ...args){

        Predicate<Customer> isVip = new Predicate<Customer>() {
            @Override
            public boolean apply(Customer customer) {
                return customer.isVip();
            }
        };

        Predicate<Customer> isConferenceAttendee = new Predicate<Customer>() {
            @Override
            public boolean apply(Customer customer) {
                return customer.isConferenceAttendee();
            }
        };

        List<Customer> customers = Lists.newArrayList();

        customers.add(new Customer("jim",true,false));
        customers.add(new Customer("bob",false,true));
        customers.add(new Customer("rob",true,true));

        System.out.println("Vips:\t"+Iterables.filter(customers, isVip));
        System.out.println("Vips && ConfAttendees:\t"+Iterables.filter(customers, Predicates.and(isVip,isConferenceAttendee)));
        System.out.print("Vips || ConfAttendees:\t"+Iterables.filter(customers, Predicates.or(isVip,isConferenceAttendee)));
    }
}

class Customer {
 private String name;
 private boolean vip;
 private boolean conferenceAttendee;

    Customer(String name, boolean vip, boolean conferenceAttendee) {
        this.name = name;
        this.vip = vip;
        this.conferenceAttendee = conferenceAttendee;
    }

    public String getName() {
        return name;
    }

    public boolean isVip() {
        return vip;
    }

    public boolean isConferenceAttendee() {
        return conferenceAttendee;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Customer customer = (Customer) o;

        if (name != null ? !name.equals(customer.name) : customer.name != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                '}';
    }
}