Всем привет. По случаю конкурса я решил написать тут не статью, но небольшой урок. Он будет про лямбды и стримы (stream) в Java. Если вы уже знакомы и используете их, то мотайте сразу к концу статьи, там будет небольшая подборка задач с JavaRush на которых можно потренироваться. Нужна java 8 и выше, закалка от JR, будет мало подробностей и много непонятного, сильное желание разобраться. Начнем с того, что я не буду объяснять историю появлений лямбд и стримов, просто сам её не знаю. Знаю только то, что пришли они из функционального стиля программирования, в наш ООП’шный. За мой короткий опыт обучения, просто показывал, как и что, некоторым людям сложновато понять идею, поэтому просто запоминайте, как пишется, поймете потом.

Лямбды

Лямбды и стримы, только практика, теории не будет - 1Лямбды и стримы, только практика, теории не будет - 2Если вы совсем не знаете что такое лямбды, то: Лямбда выглядит так:

(a, b) -> a.compareTo(b)
(переменные) -> действие
Этого пока достаточно. Почитать теорию можно тут: ссылка раз, ссылка два, но мне кажется практика гораздо веселее. Предлагаю вам решить такую задачку: Напишите калькулятор 1 методом. Метод должен принимать 2 цифровых значения и кое-что ещё. Код ваш будет выглядеть примерно так:

class Lambda{
    public static void main (String[] args) {
	}
	
    public static double calculate(){
       	return null;
    }
}
Вам надо вписать 3 параметра в сигнатуру метода calculate, дописать 1 команду в return и протестировать вызов этого метода в main. Что должен уметь этот метод
  • Складывать;
  • умножать;
  • делить;
  • вычитать;
  • вычислять корень;
  • возводить в степень;
  • возводить в степень сумму аргументов поделенную на первое число + 117;
  • и все любые другие операции, которые сможете придумать.
Что нельзя использовать:
  • if-else;
  • char как указатель операции;
  • switch-case;
  • и все остальное что вам придет в голову.
Что можно использовать:
  • Только лямбды, задание то на них.
— Что? И это все? — Да это все, потому что дописать надо буквально 3 строки, если я подскажу хоть одну, остальные будут написаны на автомате. А при желании вы сможете нагуглить примеры, попытаться понять. Проверять конечны вы будете себя сами и если схитрите никто не узнает, но тогда зачем? Решив такую простенькую задачку, все мои 1,5 ученика обрели примерное понимание, что такое лямбды и как ими пользоваться. Это будет очень нужно для стримов. Если есть желание похвастаться результатом и узнать правильно ли вы сделали, код кидайте в личку. В комментарии не надо, туда можете кинуть интересные подсказки (но так, чтобы не слишком облегчать задачу). Повторюсь, решив этот пример, вы должны уже примерно понять, как пользоваться лямбдами.
Лямбды и стримы, только практика, теории не будет - 3
Теперь перейдем к стримам (java streams). Это не те стримы о которых ты, читатель возможно подумал. Нет это не inputStream и не OutputStream. Это другое, это интереснее. Стримы пришли на замену циклам, не полностью, но все же. Подаются они с девизом «не объясняй, как делать, объясняй что делать». Небольшой пример стрима:

	List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

	myList.stream()
	    .filter(s -> s.startsWith("c"))
	    .map(String::toUpperCase)
	    .sorted()
	    .forEach(System.out::println);
Что тут происходит? Добавим комментарии:

	myList.stream() // получить поток
	    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
	    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
	    .sorted() // отсортировать по порядку (дефолтный порядо)
	    .forEach(System.out::println); // вывести каждый элемент на экран
Сравним с обычным циклом:

List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Когда читаешь код, все выглядит страшно, а с комментариями проще так? Это нормально, я их тоже долго не понимал. Ключ к пониманию – практика. Поэтому начинаем читать сторонние статьи и искать ответы на свои вопросы, можете их так же задавать тут в комментарии, полноценный ответ не дам, но укажу направление. Список задач от JavaRush, которые, я считаю, отлично подходят для практики стримов:
  • 2208 — можно решить 1 стримом и 1 return, т.е. тело метода будет начинаться с return и дальше будет 1 целый стрим. Требование StringBuilder опустим.

  • 1908 — так же можно решить 1 стримом и 1 return. Начиная с чтения файла. Запись в файл через стримы как сделать я не знаю (если это возможно), пока делаем ручками. Т.е. Открываем только 2 потока (консоль и запись в файл). Чтение файла производим через методы, которые вернут нам либо лист, либо сразу стрим (google и javadoc).

  • 1907 — по идее тоже можно решить в один стрим. На входе стрима имя файла, на выходе количество слов world.

На этом все. Если смогу напишу ещё уже просто рассказ. На мой взгляд, читать про что-то крутое без возможности это попробовать, как-то скучно, что ли. А после калькулятора и 3 задачек думаю вы уже неплохо ладите с лямбдами и стримами, чтобы почитать уже обо всех возможностях, если ещё не прочитали. UPD:
  • 1016 — немного извращенным способом можно решить в 1 стрим и 1 return;

  • 1821 — очень легко и в 1 стрим и 1 return.

    Эти 2 задачи познакомят вас с ещё одним методом стримов и ещё одним коллектором.

  • 1925 — можно одним стримом получить строку со словами и потом записать её в файл (можно ли писать в файл из стрима я не знаю)