JavaRush /Java блог /Random UA /Лямбди та стрими, тільки практика, теорії не буде

Лямбди та стрими, тільки практика, теорії не буде

Стаття з групи Random UA
Всім привіт. З нагоди конкурсу я вирішив тут написати не статтю, але невеликий урок. Він буде про лямбди та стрими (stream) у Java. Якщо ви вже знайомі і використовуєте їх, то мотайте відразу до кінця статті, там буде невелика добірка задач з JavaRush, на яких можна потренуватися. Потрібна java 8 і вище, гарт від JR, буде мало подробиць і багато незрозумілого, сильне бажання розібратися. Почнемо з того, що я не пояснюватиму історію появи лямбд і стриму, просто сам її не знаю. Знаю тільки те, що прийшли вони з функціонального стилю програмування, до нашого ООП'шного. За мій короткий досвід навчання, просто показував, як і що, деяким людям важко зрозуміти ідею, тому просто запам'ятовуйте, як пишеться, зрозумієте потім.

Лямбди

Лямбди та стрими, тільки практика, теорії не буде.Лямбди та стрими, тільки практика, теорії не буде.Якщо ви зовсім не знаєте, що таке лямбди, то: Лямбда виглядає так:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Цього поки що достатньо. Почитати теорію можна тут: посилання разів , посилання два , але мені здається практика набагато веселіше. Пропоную вам вирішити таке завдання: Напишіть калькулятор одним способом. Метод повинен набувати 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 - можна одним стримом отримати рядок зі словами і потім записати його у файл (чи можна писати у файл зі стриму я не знаю)

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ