集合API改进

java8的Collection API中添加了一些新方法:

Iterator default method forEachRemaining(Consumer action)

为每个元素执行给定操作,直到所有元素都已处理或操作引发异常。

源码

  1. default void forEachRemaining(Consumer<? super E> action) {
  2. //传入一个非空消费者
  3. Objects.requireNonNull(action);
  4. //遍历执行消费者函数
  5. while (hasNext())
  6. action.accept(next());
  7. }

示例代码

  1. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
  2. Iterator<Integer> iterator = list.iterator();
  3. //创建一个消费者
  4. Consumer<Integer> consumer = i -> System.out.println("consumer print " + i);
  5. //iterator的forEachRemaining将集合中的每个元素消费
  6. iterator.forEachRemaining(consumer);

输出结果:

  1. consumer print 1
  2. consumer print 2
  3. consumer print 3

Collection default method removeIf(Predicate filter)

删除满足给定条件的此集合的所有元素。

源码

  1. default boolean removeIf(Predicate<? super E> filter) {
  2. //传入一个非空谓语
  3. Objects.requireNonNull(filter);
  4. boolean removed = false;
  5. final Iterator<E> each = iterator();
  6. while (each.hasNext()) {
  7. //遍历元素,执行谓语的校验,如果为真,则删除该元素
  8. if (filter.test(each.next())) {
  9. each.remove();
  10. removed = true;
  11. }
  12. }
  13. return removed;
  14. }

示例代码

  1. List<Integer> list = new ArrayList<>();
  2. list.add(1);
  3. list.add(2);
  4. list.add(3);
  5. list.add(4);
  6. Predicate<Integer> predicate = i -> i > 1;
  7. list.removeIf(predicate);
  8. System.out.println("remove if left items : " + list);

控制台输出:

  1. //2,3,4满足条件被删除了
  2. remove if left items : [1]

Collection spliterator()

返回Spliterator实例的方法,该实例可用于顺序或并行遍历元素。

源码

  1. //该方法是接口默认方法
  2. default Spliterator<E> spliterator() {
  3. return Spliterators.spliterator(this, Spliterator.ORDERED);
  4. }

示例代码

  1. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
  2. Spliterator<Integer> spliterator = list.spliterator();
  3. //创建顺序流
  4. Stream<Integer> stream = StreamSupport.stream(spliterator, false);
  5. //创建并行流
  6. Stream<Integer> parallelStream = StreamSupport.stream(spliterator, true);

Map replaceAll(), compute(), merge() methods

replaceAll()

替换Map中所有Entry的value值,这个值由旧的key和value计算得出,接收参数 (K, V) -> V

源码

  1. public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
  2. Node<K,V>[] tab;
  3. if (function == null)
  4. throw new NullPointerException();
  5. if (size > 0 && (tab = table) != null) {
  6. int mc = modCount;
  7. for (int i = 0; i < tab.length; ++i) {
  8. for (Node<K,V> e = tab[i]; e != null; e = e.next) {
  9. //使用给定的函数替换原来的value值,key不变
  10. e.value = function.apply(e.key, e.value);
  11. }
  12. }
  13. if (modCount != mc)
  14. throw new ConcurrentModificationException();
  15. }
  16. }

示例代码

  1. Map<String, String> map = new HashMap<>();
  2. map.put("1", "A");
  3. map.put("2", "B");
  4. map.put("3", "C");
  5. map.put("4", "D");
  6. map.put("5", "E");
  7. //replaceAll方法
  8. map.replaceAll((s, s2) -> s + s2);
  9. System.out.println(map);

输出结果:

  1. //原来的value由key + value替换掉了
  2. {1=1A, 2=2B, 3=3C, 4=4D, 5=5E}

compute()

compute方法是computeIfPresentcomputeIfAbsent方法的组合体

  • computeIfPresent:如果指定的key不存在,则通过指定的K -> V计算出新的值设置为key的值。
  • computeIfPresent:如果指定的key存在,则根据旧的key和value计算新的值newValue, 如果newValue不为null,则设置key新的值为newValue, 如果newValue为null, 则删除该key的值。

示例代码

  1. Map<String, String> map = new HashMap<>();
  2. map.put("1", "A");
  3. map.put("2", "B");
  4. map.put("3", "C");
  5. map.put("4", "D");
  6. map.put("5", "E");
  7. //key存在,根据旧的key和value计算新的值newValue
  8. map.compute("1", (k, v) -> v + " computed");
  9. System.out.println("key存在" + map.get("1"));
  10. //key不存在,通过指定的K -> V计算出新的值设置为key的值
  11. map.compute("6", (k, v) -> "F");
  12. System.out.println("key不存在" + map.get("6"));
  13. //key存在,如果newValue为null, 则删除该key的值
  14. map.compute("1", (k, v) -> null);
  15. System.out.println("key存在,设置为null " + map.get("1"));

输出结果:

  1. key存在A computed
  2. key不存在F
  3. key存在,设置为null null

merge()

如果指定的key不存在,则设置指定的value值,否则根据key的旧的值oldvalue,value计算出新的值newValue, 如果newValue为null, 则删除该key,否则设置key的新值newValue。

示例代码

  1. Map<String, String> map = new HashMap<>();
  2. map.put("1", "A");
  3. map.put("2", "B");
  4. map.put("3", "C");
  5. map.put("4", "D");
  6. map.put("5", "E");
  7. //存在key为1,输出 Amerge
  8. System.out.println(map.merge("1", "merge", (k, v) -> k + v));
  9. //新值为null,删除key,输出 null
  10. System.out.println(map.merge("1", "merge", (k, v) -> null));
  11. //不存在key为6,输出 "merge"
  12. System.out.println(map.merge("6", "merge", (k, v) -> k + v));

输出结果:

  1. Amerge
  2. null
  3. merge