Java 8 Streams - 将固定数量的谓词过滤器应用于单个 Stream

标签 java java-stream predicate

有没有办法将固定数量的 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/

相关文章:

java - 除了堆栈跟踪之外,检索调用者方法详细信息的不同方法 [Java]

java - 对象未反序列化

java - 通过 Streams 并行执行多个查询

java - 如何处理流的流?

c# - 我什么时候使用谓词

.net - 需要帮助解决 LINQ 中 And 运算符的谓词错误

c# - 如何在谓词参数上使用 NSubstitute 返回?

java - 如何使用 XStream 缩进 XML?

Java 到 HSM 连接并发送 "GC"/FK"命令

java - 仅当集合不包含具有一个匹配属性的对象时,才将对象 X 添加到集合中