Как можно использовать потоковый API для разделения массива на подмассив - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть массив размером 1000. Я хочу использовать потоковые операции для выполнения так: -

List list= new ArrayList();
//list is initialize to 1000 elements 

  List subList = list.subList(0, 100);
   // perform some operaions over the subarray
  List subList1 = list.subList(101, 200);
   // perform some operaions over the subarray
 .... so on
}

Я хочу код с использованием потокового API. Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 11 апреля 2019

А как же:

  List<List<Integer>> result = IntStream.range(0, list.size() / 100)
         .mapToObj(index -> list.subList(index * 100, index * 100 + 100))
         .collect(Collectors.toList());
2 голосов
/ 11 апреля 2019

Вы можете использовать Collectors.partitioningBy:

Map<Boolean, List<Integer>> map = list.stream().collect(Collectors.partitioningBy(element -> list.indexOf(element) >= 100));
and then do:  
List<List<Integer>> results = new ArrayList(map.values());

Обновление: Collectors.partitioningBy принимает предикат и, следовательно, не может решить желаемый вариант использования.

Или, если вы хотите разбить список на равные части (что, я думаю, больше подходит для вашего случая), вы можете использовать Collectors.groupingBy():

Map<Integer, List<Integer>> groups = 
      list.stream().collect(Collectors.groupingBy(element -> (element - 1) / YOUR_NUMBER_OF_PIECES_PER_SUBLIST));
    List<List<Integer>> subLists= new ArrayList<List<Integer>>(groups.values());
System.out.println("Number of sublists " + subLists.size());

Это даст вам:

Number of sublists: 5

при работе с NUMBER_OF_PIECES_PER_SUBLIST = 200, что кажется вашим вариантом использования.

0 голосов
/ 11 апреля 2019

Вы можете использовать IntStream.iterate() для достижения этого:

int sublistItems = 100;
List<List<Integer>> result = IntStream.iterate(0, i -> i + sublistItems)
        .limit((list.size() + sublistItems - 1) / sublistItems)
        .mapToObj(startIndex -> list.subList(startIndex, Math.min(startIndex + sublistItems, list.size())))
        .collect(Collectors.toList());

Если вы используете Java 9 или выше, вы можете упростить это так:

int sublistItems = 100;
List<List<Integer>> result = IntStream.iterate(0, i -> i < list.size(), i -> i + sublistItems)
        .mapToObj(startIndex -> list.subList(startIndex, Math.min(startIndex + sublistItems, list.size())))
        .collect(Collectors.toList());
...