我们说我有一个List<Object>
,其中包含100个对象。使用Java 8(没有任何tierce库)获得List<List<Object>>
包含10 List
10 Object
的最佳方式是什么?
答案 0 :(得分:2)
您需要一个外部final
计数器,但这似乎有效。
// Must be final (or implicitly final).
AtomicInteger n = new AtomicInteger();
Map<String, List<Integer>> groups = IntStream.range(0, 100)
.boxed()
.collect(Collectors.groupingBy(
// Group by n / 10.
o -> String.valueOf(n.getAndIncrement() / 10)
)
);
答案 1 :(得分:1)
我首先考虑chuck大小(在你的情况下为10个元素),然后查看列表并使用subList
从中取出块。 E.g:
List<List<Object>> subLists = IntStream
.range(0, (int) Math.ceil((double) list.size() / subListSize))
.mapToObj(i -> new ArrayList<>
(list.subList(i * subListSize, (i + 1) * subListSize)))
.collect(Collectors.toList());
注意:强>
如果double
没有完全划分subListSize
,则list.size()
和天花板的转换是为了避免整数除法。
答案 2 :(得分:1)
使用番石榴更简单(你在帖子without any tierce library
中提到我无论如何都把它放了)
@Test
public void givenList_whenParitioningIntoNSublists_thenCorrect() {
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subSets = Lists.partition(intList, 3);
List<Integer> lastPartition = subSets.get(2);
List<Integer> expectedLastPartition = Lists.<Integer> newArrayList(7, 8);
assertThat(subSets.size(), equalTo(3));
assertThat(lastPartition, equalTo(expectedLastPartition));
}
答案 3 :(得分:1)
在java 9中,您可以使用takeWhile使用IntStream生成索引,然后使用这些索引从原始列表中获取子列表。 这适用于任何对象列表:
private static final int BATCH_SIZE = 10;
public void test(){
List<List<Object>> batchedLists = split(generateTestObjects());
}
public List<List<Object>> split(List<Object> objects) {
return IntStream.iterate(0, n -> n + BATCH_SIZE)
.takeWhile(n -> n < objects.size())
.map(t -> objects.subList(t, Math.min(t + BATCH_SIZE, objects.size()))
.collect(Collectors.toList());
}
public List<Object> generateTestObjects(){
return IntStream.range(0, 100)
.boxed()
.collect(Collectors.toList());
}