Java 8 Stream 如何还原为集合

由于 Java 对集合的函数式操作并非原生态的,必须对得到的 stream() 进行过滤等操作,之后还是一个
stream(),一般我们最后返回给调用者需还原为相应的集合。这无法与 Scala 的 for … yield 操作相比。例如下面在使用
Stream API 过滤获得所有大于 3 的数字之后,方法的返回值还应该还原为 List, 这个需求非常自然

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> greaterThan3(list) {
  Stream<Integer> streamOfInteger = list.stream().filter( i -> i > 3);
  return streamOfInteger.ToIntegerList......;
}

我们这儿的问题就是如何把上面的 streamOfInteger 转换为 List, 有以下几种办法

  • 1 使用 Collectors.toList 方法 *

    streamOfInteger.collect(Collectors.toList());

  • 2 使用 toCollection() 方法 **

    streamOfInteger.collect(Collectors.toCollection(ArrayList::new))

  • 3 forEach() 方法 *

    List newList = new ArrayList<>();
    streamOfInteger.forEach(newList::add);
    streamOfInteger.forEachOrdered(newList::add); //或者

  • 4 toArray() 方法

    Integer[] arrayOfInteger = streamOfInteger.toArray(Integer[]::new);
    List newList = Arrays.asList(arrayOfInteger);

此法更觉多此一举 此外,不妨窥探下使用 Stream API 处理后的 Map 该如何还原为 Map

Map<String, String> map = new HashMap<>();
map.put("a", "aa");
map.put("b", "bb");
Stream<Map.Entry<String, String>> filtered = map.entrySet().stream()
  .filter(entry -> entry.getKey().equals("b"));

filtered.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

//或
filtered.collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue()));

//或
Map<String, String> newMap = new HashMap<>();
filtered.forEach(entry -> newMap.put(entry.getKey(), entry.getValue()));
    原文作者:_cuiyaoqiang
    原文地址: https://blog.csdn.net/cuiyaoqiang/article/details/52918147
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞