Как в потоке данных объединить буквы образуя слово?

136
01 февраля 2020, 08:40

Есть массив слов. Я хочу его в потоке stream немного обработать. Абстрактная задача.

Задача:

  • Преобразовать все слова в нижний регистр
  • Получить первую букву из слова
  • Объединить эти буквы от 3-4 образуя слово

Используя потоки, можно ли это реализовать?

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class WordsStream {
    public static void main(String[] args){
        String contents = "Гештальт, в первом приближении, социально аннигилирует закон. Психоанализ отражает латентный генезис.";
        List<String> list = Arrays.asList(contents.split("\\PL+"));
        Stream<String> stringStream = list.stream()
                // Преобразуем все в нижний регистр
                .map(String::toLowerCase)
                // Получаем первую букву слова
                .map(s -> s.substring(0, 1))
                // Объединить буквы от 3-4 составив "слова"
        ;
        System.out.println(Arrays.toString(stringStream.toArray()));
    }
}

output на текущий момент:

[г, в, п, п, с, а, з, п, о, л, г]

Ожидаемый результат:

[гвпп, сазп, олг]
Answer 1

На базе исходного кода и данного ответа получается так:

String contents = "Гештальт, в первом приближении, социально аннигилирует закон. Психоанализ отражает латентный генезис.";
List<String> list = Arrays.asList(contents.split("\\PL+"));
int size = 4;
Object[] result = IntStream.range(0, (list.size() + size - 1) / size)
                           .mapToObj(index -> list.subList(index * size, Math.min(size * (index + 1), list.size())))
                           .map(subList -> subList.stream()
                                                  .map(word -> word.substring(0, 1).toLowerCase())
                                                  .collect(Collectors.joining()))
                           .toArray();
System.out.println(Arrays.toString(result));
  • Создаём поток с номерами итоговых групп букв
  • Получаем подсписки из исходного списка
  • Каждый подсписок слов преобразуем, беря первую букву каждого слова с приведением её к нижнему регистру и объединяя итоговые бувы в строку
Answer 2
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class WordsStream {
    public static void main(String[] args){
        String contents = "Гештальт, в первом приближении, социально аннигилирует закон. Психоанализ отражает латентный генезис.";
        List<String> list = Arrays.asList(contents.split("\\PL+"));
        String string = list.stream()
                // Преобразуем все в нижний регистр
                .map(String::toLowerCase)
                // Получаем первую букву слова
                .map(s -> s.substring(0, 1))
                .collect(Collectors.joining())
                // Объединить буквы от 3-4 составив "слова"
        ;
        System.out.println(string);
    }
}
READ ALSO
Редактирование строк xml

Редактирование строк xml

Есть строки в xml которые я вытягиваю в кодев IntelliJ IDEA, когда открываешь файл с кодом, видно так

147
@SessionAttributes в Spring не обновляется

@SessionAttributes в Spring не обновляется

У меня есть два контроллера

148
Класс Object и аргументы

Класс Object и аргументы

Изучаю класс Object: Множество методов класса ArrayList используют основной полиморфический тип ObjectПоскольку каждый класс в языке Java - потомок класса...

142