java - 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。
解决方案
流本身只是对收集时要执行的操作的描述,并且是不可变的。每个方法都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);
推荐阅读
- workflow - AEM 工作流自动提前超时不起作用。
- vue.js - Vue-CLI 组件错误:您正在使用仅运行时构建的 Vue,其中模板编译器不可用
- ios - 在Objective C中使用NSURLSession downloadTask顺序下载多个图像
- java - 在firebase中创建异常
- android - 将我的活动中的事件委托给屏幕
- python - 不能在序列化器 django rest 框架中为每个对象使用不同的字段
- javascript - 即使在 codepen 上运行,Js 在我的网站上也无法按预期运行
- r - 在 R 中转换数据
- c++ - 使用 std::chrono::duration 跟踪超时
- python - 如何为应用引擎应用程序设置 vscode Python 调试器?