遍历 foreach
Java 8的foreach() 办法 是一种无效的形式,用来遍历书架汇合,能够对List,Stream 进行遍历,该办法曾经被增加到以下接口中
- Iterable 接口-
- Map 接口
- Stream 接口
1. Iterable foreach
1.1 foreach 办法
上面的代码中给定了Iterable 接口中foreach 办法的默认实现
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); }}
该foreach 办法action 对每个元素执行给定,Iterable 直到所有的元素都解决或 action 引发异样
实例1,应用 foreach 遍历list 的java 程序
List<String> names = Arrays.asList("Alex", "Brian", "Charles"); names.forEach(System.out::println);
输入:
AlexBrianCharles
1.2 创立消费者行为--- consumer
在下面的实例中,action 示意承受单个输出参数并且不返回任何数据, 它是Consumer 接口的实例,通过这样的创立消费者操作. 咱们制订要以相似办法的语法 执行多个语句
public static void main(String[] args) { List<String> names = Arrays.asList("Alex", "Brian", "Charles"); // 创立一个生产之操作 Consumer<String> makeUpperCase = new Consumer<String>() { @Override public void accept(String o) { System.out.println(o.toUpperCase()); } }; names.forEach(makeUpperCase); }// 后果ALEXBRIANCHARLES
应用匿名函数外部类的形式,当初能够应用 lanmbda 表达式代替
Consumer<String> makeUpperCase = o -> System.out.println(o.toUpperCase());
2 Map 中 foreach
2.1 foreach 办法
该办法执行给定的BiConsumer action 来执行map 中entry,晓得所有的是数据被解决完,或者抛出异样
map 中的默认办法
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); }}
实例2 ,通过foreach 办法来遍历map
Map<String, String> map = new HashMap<String, String>(); map.put("A", "Alex"); map.put("B", "Brian"); map.put("C", "Charles"); BiConsumer<String, String> biConsumer = new BiConsumer<String,String>() { @Override public void accept(String key, String value) { System.out.println(key+" "+value); } }; map.forEach(biConsumer); } // 应用lambda 表达式 替换 匿名函数BiConsumer<String, String> biConsumer = (key, value) -> System.out.println(key+" "+value);
打印后果
A AlexB BrianC Charles
3. Stream foreach 和 forEachOrdered
在Stream中 foreach 和 foreEachOrdered 都是终端操作,Stream 的 foreach 办法 对map 中的每一个元素执行一个action 办法,对于程序流,元素的程序流 与源流中的程序是放弃始终的,应用并行流的时候,foreachOrdered办法很无效,尽量应用这个办法,foreach 无奈保障在并行流中元素的程序
例子3 遍历Stream 中 foreach
List<Integer> numberList = Arrays.asList(1,2,3,4,5); Consumer<Integer> action = System.out::println; numberList.stream() .filter(n -> n%2 == 0) .forEach( action );输入: 2 4
例子 4 应用 foreachOrdered 遍历stream
List<Integer> numberList = Arrays.asList(1,2,3,4,5); Consumer<Integer> action = System.out::println; numberList.stream() .filter(n -> n%2 == 0) .parallel() .forEachOrdered( action );