Лямбды
![Лямбды и стримы, только практика, теории не будет - 1](https://cdn.javarush.com/images/article/7fd8a424-2f83-4382-b73e-7da1e2f5d080/1024.jpeg)
![Лямбды и стримы, только практика, теории не будет - 2](https://cdn.javarush.com/images/article/587a5ea5-5a9e-4759-ab41-c9c426f922c1/1024.jpeg)
(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](https://cdn.javarush.com/images/article/229db17e-518b-4e20-a9ed-e216ddd0f96d/1024.jpeg)
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.
1016 — немного извращенным способом можно решить в 1 стрим и 1 return;
1821 — очень легко и в 1 стрим и 1 return.
Эти 2 задачи познакомят вас с ещё одним методом стримов и ещё одним коллектором.
1925 — можно одним стримом получить строку со словами и потом записать её в файл (можно ли писать в файл из стрима я не знаю)
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ