JAVA8系列教程-内部与外部迭代器
温馨提示:
本文最后更新于 2020年04月21日,已超过 1,675 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
外部迭代
直到Java 7为止,collections框架都依赖于外部迭代的概念,其中Collection通过实现Iterable提供枚举其元素(即Iterator)的方法,并且客户端使用它顺序地遍历collection的元素。例如,如果我们想将所有字符串都大写,则可以这样写:
public class IterationExamples { public static void main(String[] args){ List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"}); for(String letter: alphabets){ System.out.println(letter.toUpperCase()); } } }
或者我们可以这样写:
public class IterationExamples { public static void main(String[] args){ List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"}); Iterator<String> iterator = alphabets.listIterator(); while(iterator.hasNext()){ System.out.println(iterator.next().toUpperCase()); } } }
以上两个代码段均用于外部迭代。外部迭代非常简单,但是存在几个问题:
1)Java的for-each循环/迭代器本质上是顺序的,并且必须按集合指定的顺序处理元素。
2)它限制了管理控制流的机会,这可能通过利用数据的重新排序,并行性,短路或惰性来提供更好的性能。
内部迭代
有时需要for-each循环的有力保证(顺序,顺序),但通常只是性能的劣势。外部迭代的替代方法是内部迭代,客户端让其由库处理而不是控制迭代,而仅提供必须对所有/某些数据元素执行的代码。
上一个示例的内部迭代等效项是:
public class IterationExamples { public static void main(String[] args){ List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"}); alphabets.forEach(l -> l.toUpperCase()); } }
在外部迭代将“ what”(大写)和“ how”(对于循环/迭代器)混合使用的情况下,内部迭代使客户端仅提供“ what”,而由库控制“ how”。这提供了许多潜在的好处:客户端代码可以更清晰,因为它只需要关注于陈述问题,而不是解决问题的细节,并且我们可以将复杂的优化代码移到可以使所有用户受益的库中。
正文到此结束
- 本文标签: 其他
- 本文链接: https://www.v8en.com/article/260
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
热门推荐
相关文章
该篇文章的评论功能已被站长关闭