java如何过滤具有多个参数的流数据?
我有一个来自存储在S3中的JSON文件的源代码列表。我需要在列表的几个字段上提供搜索过滤器。我已经创建了一个Builder类,其中包含了可以过滤数据的所有必需字段
现在我想使用Java streams,并根据用户提供的参数对数据应用过滤器。用户可根据需要提供全部6个参数或只传递2或3个参数。例如,用户只提供6个参数中的2个,我应该能够根据给定的2个参数过滤数据,并忽略值为null的4个参数
public class ListOfFields {
private String country;
@JsonProperty("product")
private String product;
private String transactionId;
private String sourceBy;
private String category;
private String specialTag;
private String organicTag;
private String successTag;
private String speedTag;
private String foodTag;
private String costPrice;
private String fruitType;
private String fruitVendorId;
}
下面是生成器类
public class ProductClass {
@Builder.Default
private String country = 'UnitedStates';
private String sourceBy;
private Boolean specialTag;
private String category;
private Boolean priceTag;
private String fruitType;
}
下面的方法,用户可以通过该方法调用以获取产品
public String getProduct(ProductClass productQuery) {
List<ListOfFields> result = listOfFields // (the declaration is made before in the class as private List<ListOfFields> listOfFields;)
.stream().filter(productQuery::match)
.collect(Collectors.toList());
如何将动态谓词作为上面的匹配函数?我应该能够过滤用户提供的参数,无论是1或2或3或4。。。以及不使用用户未传递筛选条件中任何值的参数
# 1 楼答案
将
ProductClass
视为输入,并考虑null
值以避免出现键。您可以使用接受实际查询参数的方法来定义Predicate
的列表达到此值后,列表可以是
reduce
d以表示单个Predicate
,例如:现在,在
stream
处理ListOfFields
类型的对象时,可以很容易地使用这个谓词# 2 楼答案
您可以对每个参数使用常规if语句,并应用返回流的过滤器