Используйте лямбда-выражения, когда это возможно
В этой истории я покажу, насколько мощными являются лямбда-выражения Java. В большинстве случаев вы можете выполнить свою работу всего одной строкой кода! Давайте представим, что вам нужно выполнить следующую задачу:
Вам задана строка
word
, состоящая из цифр и строчных букв латинского алфавита.
Вы замените каждый нецифровой символ пробелом. Например,
"a123bc34d8ef34"
станет" 123 34 8 34"
. Обратите внимание, что у вас остались некоторые целые числа, разделенные хотя бы одним пробелом:"123"
,"34"
,"8"
и"34"
.
Возвращает количество различных целых чисел после выполнения операций замены над
word
.
Два целых числа считаются разными, если их десятичные представления без начальных нулей различны.
Вот решение и объяснение чуть ниже кода Java:
Программирование — это просто перевод объектов из одного состояния в другое. Вот как вы можете создать решение с помощью всего одной строки кода, используя несколько преобразований:
word.replaceAll("[a-z]+", " ")
- Заменяем все последовательные буквы пробелом. Итак, у нас есть числа, разделенные пробелами. replaceAll() возвращает только одну строку.word.replaceAll("[a-z]+", " ").split(" ")
- Мы разбиваем числа на массив чисел (как массив строк). Первый и последний элементы могут быть пустыми строками, если у нас есть пробел в начале или конце строкиword.replaceAll("[a-z]+", " ")
Arrays.stream(word.replaceAll("[a-z]+", " ").split(" "))
- преобразовать массив в поток элементов.filter(s -> !"".equals(s))
- удаляет возможно пустые строки в начале или конце потока строк.map(s -> s.replaceFirst("^0+", ""))
- преобразует числа (как строки) в строки без ведущих нулей. Это то, что говорит регулярное выражение^0+
. Мы удаляем только первое вхождение this, потому что есть только одно начало строки :-). replaceAll() также будет работать..collect(Collectors.toSet())
- делает набор из строкового потока. Дубликаты удаляются, потому что это установлено.size()
- Размер набора равен количеству различных чисел
Мы не использовали Long.parseLong() или Integer.parseInt(), потому что количество цифр в числе может быть довольно большим, и у нас были бы исключения. Поэтому мы использовали набор строк.
Это все, ребята! Если вам нравится история, подписывайтесь на меня.