前言
Java8给所有的集合都添加了一个新的方法forEach,该方法遍历集合中的元素并为每个元素执行指定的动作。
注意,这里说的是集合的forEach方法,方法是在接口Iterable中的。而不是流Stream中的forEach方法,这两个特别容易混淆,两个方法的功能类似,但是使用场景有所区别。
下面这个就是集合的Iterable接口和Map接口中的forEach方法,它有一个默认实现,子类无需实现这个方法,集合对象可以直接调用forEach方法。
复制代码
1
2
3
4
5
6
7
8
9
10public interface Iterable<T> { // 只列出此方法 default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public interface Map<K, V> { // 只列出此方法 default void forEach(BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); for (Map.Entry<K, V> entry : entrySet()) { K k; V v; try { k = entry.getKey(); v = entry.getValue(); } catch (IllegalStateException ise) { // this usually means the entry is no longer in the map. throw new ConcurrentModificationException(ise); } action.accept(k, v); } } }
下面这个是Stream流中的forEach方法,是个抽象方法,由子类实现。
复制代码
1
2
3
4
5public interface Stream<T> extends BaseStream<T, Stream<T>> { // 只列出此方法 void forEach(Consumer<? super T> action); }
正文
在forEach方法出现之前,遍历集合要使用for循环,或者Iterable对象,比较复杂。Java8之后,可以直接调用forEach方法,使用Lambda表达式简化语法,如果对Lambda表达式不了解,请看本人博客:Java8新特性:Lambda表达式与函数式编程。
复制代码
1
2default void forEach(Consumer<? super T> action)
该方法对Iterable中的每个元素执行指定的操作(action),直到处理完所有元素或操作抛出异常为止。下面举一个List和Map集合遍历元素并执行指定action的例子。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12public static void main(String[] args) { Arrays.asList("hi", "hello", "sawadika").forEach((a) -> System.out.println(a)); Map<String, Integer> map = new HashMap<>(); map.put("Hi", 1); map.put("Hello", 2); map.put("你好", 3); map.forEach((k, v) -> { System.out.println(k + ":" + v); }); }
总结
集合的forEach方法提供了非常便利的循环集合的方式,它利用了Java8的新特性Lambda来实现。
最后
以上就是风中画板最近收集整理的关于Java8新特性:集合遍历forEach方法的全部内容,更多相关Java8新特性内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复