java8 - stream partitionby




Java 8 파티션 목록 (2)

이 코드를 사용해보십시오, Java 8을 사용합니다 :

public static Collection<List<Integer>> splitListBySize(List<Integer> intList, int size) {

    if (!intList.isEmpty() && size > 0) {
        final AtomicInteger counter = new AtomicInteger(0);
        return intList.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size)).values();
    }
    return null;
}

순수 Jdk8로 List를 같은 청크 (서브리스트)로 분할 할 수 있습니까?

Guava Lists 클래스를 사용하는 것이 가능하다는 것을 알고 있지만, 순수 Jdk로 할 수 있습니까? 내 프로젝트에 새로운 항아리를 추가하고 싶지는 않습니다. 단지 하나의 유스 케이스를 위해서입니다.

SOLUTONS :

지금까지 tagir-valeev 가 제시 한 최고의 솔루션 :

나는 또한 세 가지 다른 가능성을 발견했지만, 단지 몇 가지 경우에만 적용됩니다.

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());

세퍼레이터로 분할 :

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());

이는 subList() 메서드를 사용하여 쉽게 수행 할 수 있습니다.

List<String> collection = new ArrayList(21);
// fill collection
int chunkSize = 10;
List<List<String>> lists = new ArrayList<>();
for (int i=0; i<collection.size(); i+= chunkSize) {
    int end = Math.min(collection.size(), i + chunkSize);
    lists.add(collection.subList(i, end));
}




partitioning