Java 8流中过滤器的if条件
仅当选中复选框或选定索引>1时,我希望在流中使用筛选器 在下面的示例中,只有一个筛选器,但我想使用多个筛选器。是否可以实施if条件Java 8流中过滤器的if条件,java,java-8,java-stream,Java,Java 8,Java Stream,仅当选中复选框或选定索引>1时,我希望在流中使用筛选器 在下面的示例中,只有一个筛选器,但我想使用多个筛选器。是否可以实施if条件 List<SoeEntry> sortedList = soeArraylist.stream() .filter(p -> p.getEntryDoy().equals(comboBoxDoys.getSelectedItem())) .sorted( Comparator .comparing
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);
编辑:我会再解释一遍。
假设我有3个带有项目的组合框。
一个用于DOY、一个用于GSAT和一个用于持续时间的组合框
我想要0到3个过滤器的wo过滤器。
如果我选择了DOY 025,我只想看到来自DOY 025的条目;如果我另外选择了GSAT XYZ,我只想看到来自DOY 025和GSAT XYZ的条目。如果我另外选择持续时间为30,我希望看到来自DOY 025的条目,带有GSAT XYZ,持续时间仅为30。流本身只是收集时要执行的操作的描述,并且是不可变的。流上的每个方法都返回一个新实例。它有点像架构师,例如StringBuilder Stream-Stream=soeArraylist.Stream; 如果Combobox1.getSelectedIndex>1{ stream=stream.filterp->p.getEntryDoy.equalscomboBox1.getSelectedItem; }否则,如果Combobox2.getSelectedIndex>1{ stream=stream.filterp->p.getEntryDoy.equalscomboBox2.getSelectedItem; }否则,如果Combobox3.getSelectedIndex>1{ stream=stream.filterp->p.getEntryDoy.equalscomboBox3.getSelectedItem; } 列表分类列表=流 .分类 比较器 .comparingSoeEntry::getEntryGSAT .Then比较seEntry::getEntryNumber .toList; System.out.printlnsortedList; 或者,先计算谓词,然后在流中使用它: 谓词; 如果Combobox1.getSelectedIndex>1{ 谓词=p->p.getEntryDoy.equalscomboBox1.getSelectedItem; }否则,如果Combobox2.getSelectedIndex>1{ 谓词=p->p.getEntryDoy.equalscomboBox2.getSelectedItem; }否则,如果Combobox3.getSelectedIndex>1{ 谓词=p->p.getEntryDoy.equalscomboBox3.getSelectedItem; }否则{ 谓词=p->true; } 列表分类列表=流 .过滤器预测 .分类 比较器 .comparingSoeEntry::getEntryGSAT .Then比较seEntry::getEntryNumber .toList; System.out.printlnsortedList;
您可以首先处理组合框(假设对象组合框)以创建谓词流链,该谓词流可以使用逻辑AND with PREDICTEAND方法打包到单个谓词中: 这可以很容易地应用:
Predicate<SoeEntry> predicate = comboboxPredicate(combobox1, combobox2, combobox3);
List<SoeEntry> sortedList = soeArraylist.stream()
.filter(predicate)
.sorted(Comparator.comparing(SoeEntry::getEntryGSAT)
.thenComparing(SoeEntry::getEntryNumber))
.collect(Collectors.toList());
最后,我找到了一个结合您的输入的解决方案
Stream<SoeEntry> stream = soeArraylist.stream();
List<Predicate<SoeEntry>> allPredicates = new ArrayList<Predicate<SoeEntry>>();
if(comboBoxDoys.getItemCount() > 0 && comboBoxDoys.getSelectedIndex() > 1) stream = stream.filter(p -> p.getEntryDoy().equals(comboBoxDoys.getSelectedItem()));
if(comboBoxSoeSC.getItemCount() > 0 && comboBoxSoeSC.getSelectedIndex() > 1) stream = stream.filter(p -> p.getEntryGSAT().contains(comboBoxSoeSC.getSelectedItem().toString()));
if(!chckbxTTCF1.isSelected() && !chckbxTTCF2.isSelected() && !chckbxTTCF3.isSelected() && !chckbxTTCF4.isSelected() && !chckbxTTCF5.isSelected() && !chckbxTTCF6.isSelected()) {
//allPredicates.add(p -> p.getEntryNumber() > 0);
} else {
if(chckbxTTCF1.isSelected()) allPredicates.add(p -> p.getEntryTTCF1().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF2.isSelected()) allPredicates.add(p -> p.getEntryTTCF2().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF3.isSelected()) allPredicates.add(p -> p.getEntryTTCF3().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF4.isSelected()) allPredicates.add(p -> p.getEntryTTCF4().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF5.isSelected()) allPredicates.add(p -> p.getEntryTTCF5().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF6.isSelected()) allPredicates.add(p -> p.getEntryTTCF6().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
stream = stream.filter(allPredicates.stream().reduce(x->false, Predicate::or));
}
List<SoeEntry> sortedList = stream
.sorted(
Comparator
.comparing(SoeEntry::getEntryNumber)
// .thenComparing(SoeEntry::getEntryNumber)
)
.collect(Collectors.toList());
//System.out.println(sortedList);
sortedList.forEach(System.out::println);
多thx to all:列出这些组合框,通过getSelectedIndex>1进行过滤,为每个结果组合框应用您当前的管道。问题不清楚:\Question不清楚,但您应该在我想到的您周围的某个地方迭代组合框列表stream@AdirD我更新了我的问题
Predicate<SoeEntry> predicate = comboboxPredicate(combobox1, combobox2, combobox3);
List<SoeEntry> sortedList = soeArraylist.stream()
.filter(predicate)
.sorted(Comparator.comparing(SoeEntry::getEntryGSAT)
.thenComparing(SoeEntry::getEntryNumber))
.collect(Collectors.toList());
Stream<SoeEntry> stream = soeArraylist.stream();
List<Predicate<SoeEntry>> allPredicates = new ArrayList<Predicate<SoeEntry>>();
if(comboBoxDoys.getItemCount() > 0 && comboBoxDoys.getSelectedIndex() > 1) stream = stream.filter(p -> p.getEntryDoy().equals(comboBoxDoys.getSelectedItem()));
if(comboBoxSoeSC.getItemCount() > 0 && comboBoxSoeSC.getSelectedIndex() > 1) stream = stream.filter(p -> p.getEntryGSAT().contains(comboBoxSoeSC.getSelectedItem().toString()));
if(!chckbxTTCF1.isSelected() && !chckbxTTCF2.isSelected() && !chckbxTTCF3.isSelected() && !chckbxTTCF4.isSelected() && !chckbxTTCF5.isSelected() && !chckbxTTCF6.isSelected()) {
//allPredicates.add(p -> p.getEntryNumber() > 0);
} else {
if(chckbxTTCF1.isSelected()) allPredicates.add(p -> p.getEntryTTCF1().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF2.isSelected()) allPredicates.add(p -> p.getEntryTTCF2().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF3.isSelected()) allPredicates.add(p -> p.getEntryTTCF3().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF4.isSelected()) allPredicates.add(p -> p.getEntryTTCF4().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF5.isSelected()) allPredicates.add(p -> p.getEntryTTCF5().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
if(chckbxTTCF6.isSelected()) allPredicates.add(p -> p.getEntryTTCF6().contains(getScHex(comboBoxSoeSC.getSelectedItem().toString()).getScGSAT()));
stream = stream.filter(allPredicates.stream().reduce(x->false, Predicate::or));
}
List<SoeEntry> sortedList = stream
.sorted(
Comparator
.comparing(SoeEntry::getEntryNumber)
// .thenComparing(SoeEntry::getEntryNumber)
)
.collect(Collectors.toList());
//System.out.println(sortedList);
sortedList.forEach(System.out::println);