Java 使用Spring集合选择的并集和交集
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
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 + '\'' +
'}';
}
}