💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

java stream 合并几个map stream 合并list_list

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝



博客目录

  • 一.需求
  • 二.具体实现
  • 1.双重 for 循环
  • 2.flatMap 实现
  • 三.性能对比
  • 1.代码
  • 2.结果


一.需求

多个 list 合并为一个 list

实现方式

  • 先创建一个类去接收 Json,再用 stream 里面的 flatMap 对数组进行扁平化处理
  • 通常我们可以使用 List 自带的 addAll 来实现;
  • 使用 for 循环也可以,用 stream 更优美:

二.具体实现

1.双重 for 循环

/**
 * 多个list合并
 *
 * @author : kwan
 * @version : 1.0.0
 * @date : 2022/8/9 10:33
 */
public class Java8_48_stream_merge_01 {
  public static void main(String[] args) {
    List<Person> personList = new ArrayList<>();
    personList.add(new Person("Sherry", 9000, 24, "female", "New York"));
    personList.add(new Person("Tom", 8900, 22, "male", "Washington"));
    personList.add(new Person("Jack", 9000, 25, "male", "Washington"));
    personList.add(new Person("Lily", 8800, 26, "male", "New York"));
    personList.add(new Person("Alisa", 9000, 26, "female", "New York"));
    List<Person> personList2 = new ArrayList<>();
    personList2.add(new Person("Sherry", 9000, 24, "female", "New York"));
    personList2.add(new Person("Tom", 8900, 22, "male", "Washington"));
    personList2.add(new Person("Jack", 9000, 25, "male", "Washington"));
    personList2.add(new Person("Lily", 8800, 26, "male", "New York"));
    personList2.add(new Person("Alisa", 9000, 26, "female", "New York"));
    List<List<Person>> list = new ArrayList<>();
    list.add(personList);
    list.add(personList2);
    List<Person> persons = merge(list);
    System.out.println(JSONArray.toJSONString(persons));
  }
  private static List<Person> merge(List<List<Person>> list) {
    List<Person> persons = new ArrayList<>();
    for (List<Person> people : list) {
      for (Person person : people) {
        persons.add(person);
      }
    }
    return persons;
  }
}

2.flatMap 实现

/**
 * 多个list合并
 *
 * @author : kwan
 * @version : 1.0.0
 * @date : 2022/8/9 10:33
 */
public class Java8_48_stream_merge_02 {
    public static void main(String[] args) {
        List<Integer> list = ImmutableList.of(1, 3, 5);
        list = list.stream().flatMap(l -> {
            List<Integer> list1 = new ArrayList<>();
            list1.add(l + 1);
            list1.add(l + 2);
            return list1.stream();
        }).collect(Collectors.toList());
        System.out.println(list);// [2, 3, 4, 5, 6, 7]
    }
}
/**
 * 多个list合并
 *
 * @author : kwan
 * @version : 1.0.0
 * @date : 2022/8/9 10:33
 */
public class Java8_48_stream_merge_03 {
    public static void main(String[] args) {
        List<List<Map<String, Object>>> lists = ImmutableList.of(
                ImmutableList.of(
                        ImmutableMap.of("a", 1, "b", 2), ImmutableMap.of("a", 2, "b", 3)
                ),
                ImmutableList.of(
                        ImmutableMap.of("a", 3, "b", 4), ImmutableMap.of("a", 4, "b", 5)
                ),
                ImmutableList.of(
                        ImmutableMap.of("a", 5, "b", 6), ImmutableMap.of("a", 6, "b", 7)
                )
        );
        // 将多个list合并为一个list
        List<Map<String, Object>> list = lists.stream().flatMap(Collection::stream).collect(Collectors.toList());
        System.out.println(JSONArray.toJSONString(list));
    }
}

三.性能对比

1.代码

public class Mytest {
    public static void main(String[] args) {
        ArrayList<String> list_1 = new ArrayList<>();
        ArrayList<String> list_2 = new ArrayList<>();
        for (int i = 0; i < 10000 ; i++) {
            list_1.add(i+"");
        }
        for (int i = 10000; i < 20000 ; i++) {
            list_2.add(i+"");
        }
        LocalDateTime start1 = LocalDateTime.now();
        List<String> list = merge1(list_1, list_2);
        LocalDateTime end1 = LocalDateTime.now();
        System.out.println("merge1花费时间:"+ Duration.between(start1, end1).toMillis()+"毫秒");

        LocalDateTime start2 = LocalDateTime.now();
        List<String> list2 = merge2(list_1, list_2);
        LocalDateTime end2 = LocalDateTime.now();
        System.out.println("merge2花费时间:"+ Duration.between(start2, end2).toMillis()+"毫秒");

        LocalDateTime start3 = LocalDateTime.now();
        List<String> list3 = merge3(list_1, list_2);
        LocalDateTime end3 = LocalDateTime.now();
        System.out.println("merge3花费时间:"+ Duration.between(start3, end3).toMillis()+"毫秒");


        LocalDateTime start4 = LocalDateTime.now();
        List<String> list4 = merge4(list_1, list_2);
        LocalDateTime end4 = LocalDateTime.now();
        System.out.println("merge4花费时间:"+ Duration.between(start4, end4).toMillis()+"毫秒");

        LocalDateTime start5 = LocalDateTime.now();
        List<String> list5 = merge5(list_1, list_2);
        LocalDateTime end5 = LocalDateTime.now();
        System.out.println("merge5花费时间:"+ Duration.between(start5, end5).toMillis()+"毫秒");
    }
    //1.List接口提供addAll(Collection)了将指定集合的所有元素追加到列表末尾的方法。
    private static<T> List<T> merge1(List<T> list1,List<T> list2){
        ArrayList<T> list = new ArrayList<>();
        list.addAll(list1);
        list.addAll(list2);
        return list;
    }
    //2.使用ArrayList构造函数通过第一个列表初始化结果列表,从而避免对的额外调用addAll()
    public static<T> List<T> merge2(List<T> list1, List<T> list2)
    {
        List<T> list = new ArrayList<>(list1);
        list.addAll(list2);

        return list;
    }
    // 3.Collections类提供了对集合进行操作的几种有用的静态实用程序方法。
    // 一种这样的方法是addAll(Collection, T[])将所有指定的元素添加到指定的集合中
    //此方法类似于List.addAll()但可能运行得更快。
    public static List<String> merge3(List<String> list1, List<String> list2)
    {
        List<String> list = new ArrayList<>();

        Collections.addAll(list, list1.toArray(new String[0]));
        Collections.addAll(list, list2.toArray(new String[0]));

        return list;
    }
    //4.我们使用静态工厂方法从列表中获取由元素组成的流,
    // Stream.of()并使用Collector将所有元素累积到新列表中
    public static<T> List<T> merge4(List<T> list1, List<T> list2)
    {
        return Stream.of(list1, list2)
                .flatMap(x -> x.stream())
                .collect(Collectors.toList());
    }
    //5.使用forEach()代替累积所有元素来避免使用收集器
    public static<T> List<T> merge5(List<T> list1, List<T> list2)
    {
        List<T> list = new ArrayList<>();
        Stream.of(list1, list2).forEach(list::addAll);

        return list;
    }
}

2.结果

结果:
merge1 花费时间:1 毫秒
merge2 花费时间:0 毫秒
merge3 花费时间:3 毫秒
merge4 花费时间:14 毫秒
merge5 花费时间:2 毫秒

速度对比:merge2 > merge1 > merge5 > merge3 > merge4