有没有一种方法可以将固定数量的 Predicates
应用于已打开的 Stream
?我真的无法让我的任何尝试都起作用。不管是什么尝试,要么以流关闭错误结束,要么没有应用所有过滤器。
示例:
// list of all JLabels of any container
private final List<JLabel> listOfLabels = new ArrayList<>();
// set of user-defined filters
private final Set<Predicate<JLabel>> filters = new HashSet<>();
// let's add some filters
filters.add(label -> label.getBackground() == Color.RED);
filters.add(label -> label.getWidth() > 500);
我该如何将所有过滤器应用于
listOfFiles
的流?假设我们想要隐藏与这些过滤器不匹配的JLabels
。我正在寻找类似于下面的非工作代码片段的东西。public void applyFilters() {
listOfLabels.forEach(label -> label.setVisible(false)); // hide all labels
Stream<JLabel> stream = listOfLabels.stream();
filters.forEach(stream::filter);
stream.forEach(label -> label.setVisible(true));
// stream closed error
}
在执行方法
applyFilters()
之后,容器应该只显示与filters
集合中定义的所有谓词匹配的标签(例如,背景为红色且宽度大于500)。请注意保留HTML标记。
filters.stream().reduce(Predicate::or)
(还是Predicate::and
)?这段代码的意思是:通过流式操作将多个Predicate
合并为一个。Predicate::or
表示使用逻辑“或”将所有谓词组合在一起,而Predicate::and
则表示使用逻辑“与”将它们组合在一起。 - Andy Turner