有没有办法将固定数量的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()方法之后,容器应该只有可见的标签,匹配由过滤器集定义的所有谓词. (在此示例中,红色背景和宽度大于500).
解决方法:
试试这个.
public void applyFilters() {
listOfLabels.forEach(label -> label.setVisible(false));
listOfLabels.stream()
.filter(label -> filters.stream()
.allMatch(predicate -> predicate.test(label)))
.forEach(label -> label.setVisible(true));
}