我正在JavaFX中创建一个办公室应用程序,我已经构建了某种过滤系统,只显示满足某些要求的人。现在这使用了一些TextField和一些CheckBoxes,但我正在寻找一种更简洁的方法来过滤数据。我现在已经有了这个(并且它有效)但我正在寻找更好的东西(我认为这应该是可能的)。
public ObservableList<Person> filter(ObservableList<Person> original){
ObservableList<Person> filtered = FXCollections.observableArrayList();
if (filtersEmpty()) {
return original;
} else {
for (Person person : original) {
boolean hold = true;
if (!firstNameFilter.getText().equals("") &&
!person.getFirstName().toLowerCase().startsWith(firstNameFilter.getText().toLowerCase())) {
hold = false;
}
if (!lastNameFilter.getText().equals("") &&
!person.getLastName().toLowerCase().startsWith(lastNameFilter.getText().toLowerCase())) {
hold = false;
}
if (!vibNumberFilter.getText().equals("") &&
!person.getVibIdentifier().toLowerCase().contains(vibNumberFilter.getText().toLowerCase())) {
hold = false;
}
if (inGroupCheckBox.isSelected() && !person.getStatus().contains(DataManager.IN_GROUP_STATUS)){
hold = false;
}
if (notOnLinkedInCheckBox.isSelected() && !person.getStatus().contains(DataManager.NO_LINKEDIN_STATUS)){
hold = false;
}
if (workedForVIBCheckBox.isSelected() && !person.getStatus().contains(DataManager.ASKED_WORK_FOR_VIB_STATUS)){
hold = false;
}
if (invitedCheckBox.isSelected() && !person.getStatus().contains(DataManager.INVITED_TO_GROUP_STATUS)){
hold = false;
}
if (placeVIBCheckBox.isSelected() && !person.getStatus().contains(DataManager.ASKED_VIB_ON_CV)){
hold = false;
}
if (placeLogoCheckBox.isSelected() && !person.getStatus().contains(DataManager.ASKED_VIB_LOGO_ON_CV)){
hold = false;
}
if (didWorkForVIBCheckBox.isSelected() && !person.getStatus().contains(DataManager.DID_WORK_FOR_VIB_STATUS)){
hold = false;
}
if (didNotWorkForVIBCheckBox.isSelected() && !person.getStatus().contains(DataManager.DID_NOT_WORK_FOR_VIB_STATUS)){
hold = false;
}
if (hold) {
filtered.add(person);
}
}
}
return filtered;
}
这些UI元素总是会引入某种代码重复和错误代码。
答案 0 :(得分:3)
如果您使用对象为您执行部分过滤,则可以简化代码。此外,应使用FilteredList
,因为它支持过滤ObservableList
并保持过滤源列表的更新以及替换谓词。
// initially unfiltered
FilteredList<Person> filteredPersons = new FilteredList<>(allPersons);
// set containing all the predicates that need to match to keep a Person
Set<Predicate<Person>> filters = ...
// keep a person iff all filters return true for the person
Predicate<Person> predicate = person -> filters.stream().allMatch(pred -> pred.test(person));
filteredPersons.setPredicate(predicate);