清洁方式筛选列表

时间:2016-08-12 11:09:54

标签: java list javafx

我正在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元素总是会引入某种代码重复和错误代码。

1 个答案:

答案 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);