Java 集合的常见操作(二)

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

将List拆分为两个

将一个List拆分为多个List

list[1, 2, 3, 4, 5, 6, 7]
第一段[1, 2, 3, 4]
第二段[5, 6, 7]

这里我们将一个集合从中心拆分为两个

        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
        int[] endpoints = {0, (list.size() + 1)/2, list.size()};
        List<List<Integer>> result =
                IntStream.rangeClosed(0, 1).mapToObj(
                                i -> list.subList(endpoints[i], endpoints[i + 1]))
                        .collect(Collectors.toList());
        System.out.println(result.get(0));
        System.out.println(result.get(1));


使用List提供的subList()方法将List拆分为两个子List

将LIst拆分为n个相等的部分

将List划分为相同大小,这里我们选择每块大小为2

list[1, 2, 3, 4, 5, 6, 7]
1[1, 2]
2[3,4]
3[5,6]
4[7]

代码如下所示:

        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
        int size = 2;
        final AtomicInteger counter = new AtomicInteger();

        final Collection<List<Integer>> result = list.stream()
                        .collect(Collectors.groupingBy(
                                        it -> counter.getAndIncrement() / size))
                        .values();
        System.out.println(result);

从List中删除重复元素

删除重复元素是代码中经常使用的操作。

list[1, 2, 3, 4, 5, 5, 6, 6]
result[1, 2, 3, 4, 5, 6 ]
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 5, 6, 6));
        List<Integer> result = new ArrayList<>(new LinkedHashSet<>(list));

        System.out.println(result);

连接两个或多个List

有时我们希望将两个或多个列表连接到一个大列表中:

list1[1, 2, 3, 4]
list2[5, 5, 6, 6]
结果[1, 2, 3, 4, 5, 5, 6, 6]

Stream类提供了很多有用的方法。这里我们使用Stream类执行来自两个列表的连接:

        List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        List<Integer> list2 = new ArrayList<>(Arrays.asList(5, 5, 6, 6));
        List<Integer> result = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());

        System.out.println(result);

我们使用了Stream类的concat()方法。我们还可以扩展此方法,可以一次加入两个以上的列表

通过条件加入列表

如果我们对列表中的数据有特殊要求,比如它们必须 > 3

list1[1, 2, 3, 4]
list2[5, 5, 6, 6]
结果[4, 5, 5, 6, 6]
        List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        List<Integer> list2 = new ArrayList<>(Arrays.asList(5, 5, 6, 6));
        List<Integer> result = Stream.concat(list1.stream(), list2.stream())
                .filter(item -> item > 3)
                .collect(Collectors.toList());

        System.out.println(result);

这里我们使用了concat()方法连接两个集合。还用Stream类的filter()方法来过滤大于3的元素