Всем привет. По случаю конкурса я решил написать тут не статью, но небольшой урок. Он будет про лямбды и стримы (stream) в java. Если вы уже знакомы и используете их, то мотайте сразу к концу статьи, там будет небольшая подборка задач с JavaRush на которых можно потренироваться. Нужна java8 и выше, закалка от JR, будет мало подробностей и много непонятного, сильное желание разобраться. Начнем с того, что я не буду объяснять историю появлений лямбд и стримов, просто сам её не знаю. Знаю только то, что пришли они из функционального стиля программирования, в наш ООП’шный. За мой короткий опыт обучения, просто показывал, как и что, некоторым людям сложновато понять идею, поэтому просто запоминайте, как пишется, поймете потом. Лямбды
Если вы совсем не знаете что такое лямбды, то : Лямбда выглядит так:
(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 ученика обрели примерное понимание, что такое лямбды и как ими пользоваться. Это будет очень нужно для стримов. Если есть желание похвастаться результатом и узнать правильно ли вы сделали, код кидайте в личку. В комментарии не надо, туда можете кинуть интересные подсказки (но так, чтобы не слишком облегчать задачу). Повторюсь, решив этот пример, вы должны уже примерно понять, как пользоваться лямбдами.
Теперь перейдем к стримам (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 потока (консоль и запись в файл). Чтение файла прозводим через методы, которые вернут нам либо лист, либо сразу стрим (гугл и javadoc).
  • 1907 – по идее тоже можно решить в один стрим. На входе стрима имя файла, на выходе количество слов world.
На этом все. Если смогу напишу ещё уже просто рассказ. На мой взгляд, читать про что-то крутое без возможности это попробовать, как-то скучно, что ли. А после калькулятора и 3 задачек думаю вы уже неплохо ладите с лямбдами и стримами, чтобы почитать уже обо всех возможностях, если ещё не прочитали. UPD: 1016 - немного извращенным способом можно решить в 1 стрим и 1 return 1821 - очень легко и в 1 стрим и 1 return Эти 2 задачи познакомят вас с ещё одним методом стримов и ещё одним коллектором. 1925 - можно одним стримом получить строку со словами и потом записать её в файл (можно ли писать в файл из стрима я не знаю.)