List<String> letters = Arrays.stream(yourString.split(" ").filter(part->part.length()==1).collect(Collectors.toList());
Пошаговое объяснение:
Возьмите исходную строку, разбейте ее на каждый пустой символ и поместите все полученные строки в массив строк:
String[] parts = yourString.split(" ");
результирующий массив строк в настоящее время также содержит строки, имеющие более 1 символа.Таким образом, вы должны перебрать эти строки и удалить все те строки, которые имеют более 1 символа, так что в итоге останутся только строки с одним символом.Java8 Streams API позволяет вам делать это описательным способом (Stream<T> filter(Predicate<? super T> predicate)
метод), поэтому давайте преобразуем массив строк в поток строк:
Stream<String> partsStream = Arrays.stream(parts);
Теперь вы можете фильтровать поток, вызывая Stream<T> filter(Predicate<? super T> predicate)
метод в этом потоке - все соответствующие строки будут возвращены как новый поток.Краткое замечание о предикатах: Java-интерфейс java.util.function.Predicate
является так называемым «функциональным интерфейсом», функциональные интерфейсы имеют только один логический метод - в случае Predicate этот единственный метод называется boolean test(T t)
.Таким образом, для каждого элемента в потоке этот метод test(...)
будет вызываться для определения того, соответствует ли элемент определенному условию.Краткая и описательная реализация этого предиката может быть так называемым лямбда-выражением (Java8 +):
// for filtering in the next line, only keep strings with 1 character!
Predicate<String> filterCondition = item -> item.length() == 1;
Stream<String> filteredStream = partsStream.filter(filterCondition);
В конце вы «собираете» все строки внутри отфильтрованного потока в java.util.List
типа java.lang.String
:
List<String> letters = filteredStream.collect(Collectors.toList());