有没有办法将固定数量的 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)。
最佳答案
当您使用 Stream 时,您必须始终使用通过应用先前操作返回的 Stream 对象的链接。 从 API 可以看出:
Stream<T> filter(Predicate<? super T> predicate);
返回 Stream 对象并且 javadoc 说:
Returns a stream consisting of the elements of this stream that match * the given predicate.
考虑到这一点,在您的情况下,我们可以应用如下内容:
转换:
filters.forEach(stream::filter);
收件人:
for (Predicate<JLabel> filter : filters) {
stream = stream.filter(filter);
}
这应该有效,因为现在您更新了 Stream 对象的链接并遵循了文档。
关于Java 8 Streams - 将固定数量的谓词过滤器应用于单个 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090724/