【发布时间】:2021-04-27 14:07:30
【问题描述】:
我有以下对象的列表:
public class OptionDetailResponse {
private long id;
private String flavor;
private String size;
private String status;
private String barcode;
}
我想根据所有 4 个字段(id 除外)在这些对象的列表中搜索:
-
flavor(来自组合框的输入) -
size(来自组合框的输入) -
status(来自组合框的输入) -
barcode(来自文本字段的输入)
这是我的带有 4 个输入字段的 UI:
我尝试了什么
我尝试使用Predicate<OptionDetailResponse> 进行搜索:
Predicate<OptionDetailResponse> selectFlavor = e -> e.getParentName().equals(flavor);
Predicate<OptionDetailResponse> selectSize = e -> e.getName().equals(size);
Predicate<OptionDetailResponse> selectStatus = e -> e.getStatus().equals(status);
Predicate<OptionDetailResponse> inputBarcode = e -> e.getBarcode().contains(barcode);
List<OptionDetailResponse> list = responseList.stream().filter(
selectFlavor.and(selectSize).and(selectStatus).and(inputBarcode))
.collect(Collectors.<OptionDetailResponse>toList());
但是当在所有搜索字段中选择一个值时,列表只返回正确的结果。
问题
- 如何在所有字段为空时使用 Predicate 获取所有列表?
- 还有其他方法可以按多个字段进行搜索吗?
【问题讨论】:
-
您无法提前知道谓词是否匹配,但您可以在收集列表后检查:
list = list.size() == 0 ? responseList: list;。此外,如果这与您的情况相关,您应该返回一份防御性副本:List.copyOf(responseList)。 -
2.复合谓词的有用资源stackoverflow.com/questions/24553761/…
标签: java search java-8 java-stream predicate