首页 > 解决方案 > Java 8流中的过滤条件

问题描述

我只想在选中复选框或选定索引 > 1 的情况下在流中使用过滤器。在下面的示例中,只有 1 个过滤器,但我想使用多个过滤器。是否可以实现 if 条件?

List<SoeEntry> sortedList = soeArraylist.stream()
   .filter(p -> p.getEntryDoy().equals(comboBoxDoys.getSelectedItem()))
   .sorted(
         Comparator
           .comparing(SoeEntry::getEntryGSAT)
           .thenComparing(SoeEntry::getEntryNumber)
          )
   .collect(Collectors.toList());
   sortedList.forEach(System.out::println);

就像是

if(comboBox1.getSelectedIndex() > 1) {.filter(p -> p.getEntryDoy().equals(comboBox1.getSelectedItem()))}
if(comboBox2.getSelectedIndex() > 1) {.filter(p -> p.getEntryGSAT().equals(comboBox2.getSelectedItem()))}
if(comboBox3.getSelectedIndex() > 1) {.filter(p -> p.getEntryDuration().equals(comboBox3.getSelectedItem()))}

编辑:我将尝试再次解释它。假设我有 3 个带有项目的 ComboBoxes。一个组合框用于 DOY,一个用于 GSAT,一个用于 DURATION。

我想要 0 到 3 个过滤器的 wo 过滤器。如果我选择 DOY 025,我只想查看 DOY 025 中的条目,如果我另外选择 GSAT XYZ,我只想查看 DOY 025 中带有 GSAT XYZ 的条目。如果我另外选择 30 的 DURATION,我想查看 DOY 025 的条目,GSAT XYZ 和 30 的 DURATION。

标签: javajava-8java-stream

解决方案


流本身只是对收集时要执行的操作的描述,并且是不可变的。每个方法都Stream返回一个新实例。它有点像 Builder(例如 StringBuilder)。

Stream<SoeEntry> stream = soeArraylist.stream();
if(comboBox1.getSelectedIndex() > 1) {
  stream = stream.filter(p -> p.getEntryDoy().equals(comboBox1.getSelectedItem()));
} else if(comboBox2.getSelectedIndex() > 1) {
  stream = stream.filter(p -> p.getEntryDoy().equals(comboBox2.getSelectedItem()));
} else if(comboBox3.getSelectedIndex() > 1) {
  stream = stream.filter(p -> p.getEntryDoy().equals(comboBox3.getSelectedItem()));
}

 
List<SoeEntry> sortedList = stream
   .sorted(
         Comparator
           .comparing(SoeEntry::getEntryGSAT)
           .thenComparing(SoeEntry::getEntryNumber)
          ))
   .collect(Collectors.toList());
   System.out.println(sortedList);

或者,先计算谓词,然后在您的流中使用它:

Predicate<SoeEntry> predicate;
if(comboBox1.getSelectedIndex() > 1) {
  predicate = p -> p.getEntryDoy().equals(comboBox1.getSelectedItem());
} else if(comboBox2.getSelectedIndex() > 1) {
  predicate = p -> p.getEntryDoy().equals(comboBox2.getSelectedItem());
} else if(comboBox3.getSelectedIndex() > 1) {
  predicate = p -> p.getEntryDoy().equals(comboBox3.getSelectedItem());
} else {
  predicate = p -> true;
}
 
List<SoeEntry> sortedList = stream
   .filter(predicate)
   .sorted(
         Comparator
           .comparing(SoeEntry::getEntryGSAT)
           .thenComparing(SoeEntry::getEntryNumber)
          ))
   .collect(Collectors.toList());
   System.out.println(sortedList);

推荐阅读