Используйте лямбда-выражения, когда это возможно

В этой истории я покажу, насколько мощными являются лямбда-выражения Java. В большинстве случаев вы можете выполнить свою работу всего одной строкой кода! Давайте представим, что вам нужно выполнить следующую задачу:

Вам задана строка word, состоящая из цифр и строчных букв латинского алфавита.

Вы замените каждый нецифровой символ пробелом. Например, "a123bc34d8ef34" станет " 123 34 8 34". Обратите внимание, что у вас остались некоторые целые числа, разделенные хотя бы одним пробелом: "123", "34", "8" и "34".

Возвращает количество различных целых чисел после выполнения операций замены надword.

Два целых числа считаются разными, если их десятичные представления без начальных нулей различны.

Вот решение и объяснение чуть ниже кода Java:

Программирование — это просто перевод объектов из одного состояния в другое. Вот как вы можете создать решение с помощью всего одной строки кода, используя несколько преобразований:

  1. word.replaceAll("[a-z]+", " ") - Заменяем все последовательные буквы пробелом. Итак, у нас есть числа, разделенные пробелами. replaceAll() возвращает только одну строку.
  2. word.replaceAll("[a-z]+", " ").split(" ") - Мы разбиваем числа на массив чисел (как массив строк). Первый и последний элементы могут быть пустыми строками, если у нас есть пробел в начале или конце строки word.replaceAll("[a-z]+", " ")
  3. Arrays.stream(word.replaceAll("[a-z]+", " ").split(" ")) - преобразовать массив в поток элементов
  4. .filter(s -> !"".equals(s)) - удаляет возможно пустые строки в начале или конце потока строк
  5. .map(s -> s.replaceFirst("^0+", "")) - преобразует числа (как строки) в строки без ведущих нулей. Это то, что говорит регулярное выражение ^0+. Мы удаляем только первое вхождение this, потому что есть только одно начало строки :-). replaceAll() также будет работать.
  6. .collect(Collectors.toSet()) - делает набор из строкового потока. Дубликаты удаляются, потому что это установлено
  7. .size() - Размер набора равен количеству различных чисел

Мы не использовали Long.parseLong() или Integer.parseInt(), потому что количество цифр в числе может быть довольно большим, и у нас были бы исключения. Поэтому мы использовали набор строк.

Это все, ребята! Если вам нравится история, подписывайтесь на меня.