2016-08-12 177 views
1

我正在用JavaFX做一个办公应用程序,我已经建立了某种过滤系统,只显示满足特定要求的人。现在,它使用了一些TextField和一些CheckBox,但我正在寻找一种更简洁的方式来过滤数据。我现在已经拥有了这个功能(并且工作正常),但我正在寻找更好的东西(我认为这应该是可能的)。干净的方式来筛选列表

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

回答

4

如果您使用对象为您完成部分过滤,则可以简化代码。此外,应该使用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); 
+0

谢谢!这看起来非常promissing :)我会去给它去;) –

+0

我试过了,它是宏伟的:)非常感谢你:) –

相关问题