Java. Коллекции. Разделение по пределу страницы - PullRequest
3 голосов
/ 11 февраля 2020

Пытаясь найти правильный способ сделать это, используя Stream / Collectors:

У меня есть обертка типа bucket (пусть она имеет StringBuilder под капотом), которая имеет ограничение char (25 символов на ведро).

У меня есть входной поток записей, которые отвечают требованию быть менее 20 символов.

Каждая запись потока обрабатывается с помощью операции .map(...), добавляя * в конец записи.

Я хочу разделить (если это правильное слово для этого случая ) поток таких записей и сбор их в ведра без потери целостности с помощью коллекторов.

Вход:

aaaaaaaaaaaaaaaa
aaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaa

Выход:

---- bucket 1 ----
    aaaaaaaaaaaaaaaa *
    aaaaaa *
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *
---- bucket 2 ----
    aaaaaaaaaaaaaaaaaa *

Я знаю, как этого добиться, используя обычные циклы, как это сделать с помощью Stream / Collectors?

1 Ответ

4 голосов
/ 11 февраля 2020

Вот один из способов:

Вы просматриваете индексы входных данных List и группируете индексы, деля их на limit.

List<String> input = Arrays.asList("a","b","c","d");
int limit = 2;
Collection<List<String>> split =
    IntStream.range(0,input.size())
             .boxed()
             .collect(Collectors.groupingBy(i -> i / limit,
                                            Collectors.mapping(input::get,
                                            Collectors.toList())))
             .values();
System.out.println (split);

Вывод:

[[a, b], [c, d]]

Изменение limit на 3 изменит выход на:

[[a, b, c], [d]]

Конечно, вы можете легко преобразовать Collection<List<String>> в List<List<String>>, если вы sh (позвонив по номеру List<List<String>> splitList = new ArrayList<>(split);).

...