乐趣区

关于java8:02-遍历-foreach

遍历 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);

输入:

Alex
Brian
Charles
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);

    }

// 后果
ALEX
BRIAN
CHARLES

应用匿名函数外部类的形式,当初能够应用 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 Alex
B Brian
C 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);
退出移动版