将FilterEditor与java增强循环一起使用

将FilterEditor与java增强循环一起使用,java,collections,apache-commons,Java,Collections,Apache Commons,我的类包含一个列表myObjects,然后我的类有一个方法,该方法需要返回该列表内容的过滤视图 为此,我使用org.apache.commons.collections4.iterators.Filtererator中的Filtererator 然后我可以创建一个过滤器迭代器,它精确地为调用方提供满足谓词的对象 这很有效,但有一个问题。使用Iterable确实需要很多样板代码,因为Java增强的for循环不能使用迭代器 那么,这个问题有什么规范的解决方案吗?Java8有自己的概念处理项,使用过滤

我的类包含一个列表myObjects,然后我的类有一个方法,该方法需要返回该列表内容的过滤视图

为此,我使用org.apache.commons.collections4.iterators.Filtererator中的Filtererator

然后我可以创建一个过滤器迭代器,它精确地为调用方提供满足谓词的对象

这很有效,但有一个问题。使用Iterable确实需要很多样板代码,因为Java增强的for循环不能使用迭代器


那么,这个问题有什么规范的解决方案吗?

Java8有自己的概念处理项,使用过滤、映射、减少和收集等操作。使用新的Stream API,您可以解决对筛选的集合执行操作的任务,如下所示:

List<String> source=Arrays.asList("foo", "bar", "baz");
source.stream().filter(s->s.startsWith("ba"))
      .forEach(element->System.out.println(element));
在这里,方法引用pred::evaluate在一个地方创建这样一个javautil谓词,该谓词的测试方法将委托给现有apachecommons谓词实例的evaluate方法

您甚至可以使用一个小技巧为现有迭代器使用for-each循环:

Iterator<String> iterator= …

for(String s: (Iterable<String>) ()->iterator) {
    System.out.println(s);
}

它使用一个lambda表达式告诉Java您需要一个Iterable,其迭代器方法将返回您现有的迭代器实例。当然,您只能在迭代器上迭代一次,因此Iterable是一个一次性实例。

,或者使用Java 8,或者使用Guava。谢谢,我不知道那个类。我正在使用Java 8,但我看不出这对我有什么帮助。Java 8引入了lambdas和新的Stream API,这是版本中最重要的更改,允许精确地对集合执行map/filter/reduce操作。list.stream.filtero->isAcceptedByFiltero.collecttoList;例如,从列表和谓词创建一个新列表。关于这一点,已经有几十篇教程和博客文章。Google it.看起来很有趣,但最后一次调用toList并没有编译。它是一个静态的收集器方法。通常是静态导入的。Iterator as Iterable技巧让我非常不舒服,所以这里有一个替代建议:Iterator上的新ForEachRestain方法。上一个示例可以重写为iterator.forEachRemainingSystem.out::println@Louis Wasserman:这只是一个附录,解决了关于使用for-each循环外部迭代的问题。如果您愿意使用内部迭代,那么仍然可以使用流API。但内部迭代方法不支持条件中断或提前返回。
Iterator<String> iterator= …

for(String s: (Iterable<String>) ()->iterator) {
    System.out.println(s);
}