【发布时间】:2015-09-08 20:06:39
【问题描述】:
是否可以将纯 Jdk8 中的 List 划分为相等的块(子列表)。
我知道可以使用 Guava Lists 类,但是我们可以使用纯 Jdk 来实现吗?我不想为我的项目添加新的 jar,只是为了一个用例。
解决方案:
迄今为止最好的解决方案是tagir-valeev提出的:
我也找到了three other possibilities,但只针对少数情况:
1.Collectors.partitioningBy() 将列表拆分为 2 个子列表 - 如下:
intList.stream().collect(Collectors.partitioningBy(s -> s > 6));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());
2.Collectors.groupingBy() 将我们的列表拆分为多个分区:
Map<Integer, List<Integer>> groups =
intList.stream().collect(Collectors.groupingBy(s -> (s - 1) / 3));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());
3.按分隔符分割:
List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8);
int[] indexes =
Stream.of(IntStream.of(-1), IntStream.range(0, intList.size())
.filter(i -> intList.get(i) == 0), IntStream.of(intList.size()))
.flatMapToInt(s -> s).toArray();
List<List<Integer>> subSets =
IntStream.range(0, indexes.length - 1)
.mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1]))
.collect(Collectors.toList());
4.使用流+计数器source:
final List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7);
final int chunkSize = 3;
final AtomicInteger counter = new AtomicInteger();
final Collection<List<Integer>> result = numbers.stream()
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
.values();
【问题讨论】:
-
你可以看看 Guava 的源代码并做相应的操作...?
-
用纯 java 写一个函数不是问题,但是 JDK8 有一些很棒的特性,可以对集合进行流式处理和操作,我认为它会比编写自己的代码更快。但这只是我的假设。
-
我将其标记为可能重复,因为那里也提供 Java-8 解决方案。
-
是的,我看到了这个问题,但是我错过了 Jdk8 解决方案,谢谢:)
-
也讨论过here
标签: java java-8 partitioning