Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

Разбиение Stream

Есть Stream, как разбить его на несколько Stream или List, относительно тех строк, которые начинаются с определенного слова (аналогично split("word") на обычной строке)?
Например, для "word":
[word, hello, dude, word and word2, stackoverflow, question, ask, word, example] => [[hello, dude], [stackoverflow, question, ask], [example]]
(Stream => Stream>)


Ответ

Можно собрать в Map по группам (группа -> список слов), а затем развернуть значения. Пример:
Stream src = Stream.of("word", "hello", "dude", "word and word2", "stackoverflow", "question", "ask", "word", "example"); final AtomicInteger group = new AtomicInteger(0); Stream> streamResult = src.map(s -> new AbstractMap.SimpleEntry<>(s, s.startsWith("word") ? 0 * group.incrementAndGet() - 1 : group.get())) .filter(entry -> entry.getValue() > -1) .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList()))) .values().stream().map(List::stream);
Если нужен результат в виде List> то:
List> listResult = new ArrayList<>(src.map(s -> new AbstractMap.SimpleEntry<>(s, s.startsWith("word") ? 0 * group.incrementAndGet() - 1 : group.get())) .filter(entry -> entry.getValue() > -1) .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList()))) .values());
Хотя в вашей ситуации непонятно зачем использовать именно stream-ы - проще просто проитерироваться по коллекции и собрать результат в нужном виде.

Комментариев нет:

Отправить комментарий