Форум программистов, компьютерный форум, киберфорум
AlexProgramm
Войти
Регистрация
Восстановить пароль

Изученный материал по Java. Lambda-выражения.

Запись от AlexProgramm размещена 08.09.2023 в 12:20
Показов 8392 Комментарии 15

Закончил тему:

15. Lambda-выражения.
  • Структура Lambda-выражений.
  • Функциональные интерфейсы.
  • Method References (Ссылки на методы).

Лямбда-выражение — это такая функция. Можете считать, что это обычный метод в Java, только его особенность в том, что его можно передавать в другие методы в качестве аргумента.
Lambda-выражения – это анонимные функции. Проще говоря, это метод без объявления, т.е. без модификаторов доступа, возвращающие значение и имя.

Функциональный интерфейс (Functional Interface) – это интерфейс только с одним абстрактным методом, объявленным в нем.

Изучал по материалам (javarush):
1. Lambda-выражения на примерах.
2. Популярно о лямбда-выражениях в Java. С примерами и задачами. Часть 1.
3. Популярно о лямбда-выражениях в Java. С примерами и задачами. Часть 2.

Задачи.

Задача 1-2.
1. Переписать этот пример так, чтобы он сортировал массивы не по возрастанию количества слов в массиве, а по убыванию.
2. Как переписать решение задачи 1 через лямбды.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
 
 
public class DZ151Lambda {
 
    public static void main(String[] args) {
        
        String[] array1 = {"мама", "мыла", "раму"};
String[] array2 = {"я", "очень", "люблю", "java"};
String[] array3 = {"мир", "труд", "май"};
 
List<String[]> arrays = new ArrayList<>();
arrays.add(array1);
arrays.add(array2);
arrays.add(array3);
//******* Сортировщики с помощью анонимного класса************
//Comparator<String[]> sortByLength = new Comparator<String[]>() {
//    @Override
//    public int compare(String[] o1, String[] o2) {
//        return o2.length - o1.length;
//    }
//};
//
//Comparator<String[]> sortByWordsLength = new Comparator<String[]>() {
//    @Override
//    public int compare(String[] o1, String[] o2) {
//        int length1 = 0;
//        int length2 = 0;
//        for (String s : o1) {
//            length1 += s.length();
//        }
//        for (String s : o2) {
//            length2 += s.length();
//        }
//        return length1 - length2;
//    }
//};
//*********************************
 
//******* Сортировщики с помощью лямбды************
//Comparator<String[]> sortByLength = new Comparator<String[]>() {
//    @Override
//    public int compare(String[] o1, String[] o2) {
//        return o2.length - o1.length;
//    }
//};
arrays.sort((o1, o2) -> o1.length - o2.length);
 
Comparator<String[]> sortByWordsLength = ( o1, o2) -> {
    int length1 = 0;
    int length2 = 0;
    for (String s : o1) {
        length1 += s.length();
    }
    for (String s : o2) {
        length2 += s.length();
    }
    return length1 - length2;
        };
//*********************************
 
 
 
for (String[] ar : arrays) {
    for (String as : ar) {
        System.out.print(as + " ");
    }
    System.out.println();
}
System.out.println();
 
arrays.sort(sortByWordsLength);
 
for (String[] ar : arrays) {
    for (String as : ar) {
        System.out.print(as + " ");
    }
    System.out.println();
}
 
        
        System.out.println("Hello World!");
    }
}
Задача 3.
Написать функциональный интерфейс с методом, который принимает число и возвращает булево значение. Написать реализацию такого интерфейса в виде лямбда-выражения, которое возвращает true если переданное число делится без остатка на 13.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class DZ153Lambda {
 
    public static void main(String[] args) {
        
        /***********С помощью анонимного класса************/
        Delim13 v1 = new Delim13() {
            @Override
            public boolean del13(int value) {
            if (value % 13 == 0)
                return true;
            else
                return false;
            }
            
        };
        //***********
        
        /***********С помощью лямбда выражения************/
        Delim13 v2 = (int a) -> {
            
            if (a % 13 == 0)
                return true;
            else
                return false;
            
        };
        //***********
        
        /***********С помощью класса************/
        Del v = new Del();
        System.out.println("Класс " + v.del13(26));
        //***********
        
        System.out.println("Ан класс " + v1.del13(12));
        System.out.println("Лямбда " + v2.del13(13));
        System.out.println("Hello World!");
    }
}
 
interface Delim13 {
    boolean del13(int value) ;
    
}
 
class Del implements Delim13 {
 
    @Override
    public boolean del13(int value) {
        if (value % 13 == 0)
            return true;
        else
            return false;
    }
    
}
Задача 4.
Написать функциональный интерфейс с методом, который принимает две строки и возвращает тоже строку. Написать реализацию такого интерфейса в виде лямбды, которая возвращает ту строку, которая длиннее.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class DZ154Lambda {
 
    public static void main(String[] args) {
        
        String str1 = "Мама мыла раму";
        String str2 = "А за нею кот задом на перед";
        
        /***********С помощью анонимного класса************/
        StrComp v1 = new StrComp() {
            @Override
            public String comp(String str1, String str2) {
            if (str1.length() > str2.length())
                return str1;
            else if (str1.length() < str2.length())
                return str2;
            else
                return "Строки равны";
            }
            
        };
        //***********
        
        /***********С помощью лямбда выражения************/
        StrComp v2 = (String strl1, String strl2) -> {
            
           
            if (str1.length() > str2.length())
                return str1;
            else if (str1.length() < str2.length())
                return str2;
            else
                return "Строки равны";
            
            
        };
        //***********
        
        /***********С помощью класса************/
        StrCompare strc = new StrCompare();
        System.out.println("Класс " + strc.comp(str1, str2));
        //***********
        
        System.out.println("Ан класс " + v1.comp(str1, str2));
        System.out.println("Лямбда " + v2.comp(str1, str2));
        System.out.println("Hello World!");
    
        
        System.out.println("Hello World!");
    }
 
}
 
interface StrComp {
    String comp(String str1, String str2);
    
}
 
class StrCompare implements StrComp {
 
    @Override
    public String comp(String str1, String str2) {
        
            if (str1.length() > str2.length())
                return str1;
            else if (str1.length() < str2.length())
                return str2;
            else
                return "Строки равны";
    }
    
    
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 15
Комментарии
  1. Старый комментарий
    Нарочно так пишешь?
    Java
    1
    2
    3
    4
    
            if (value % 13 == 0)
                return true;
            else
                return false;
    Java
    1
    
            return value % 13 == 0;
    ?

    Method references в первой задаче
    Java
    1
    
    var sortByWordsLength = Comparator.comparingInt(String::length);
    Method references в третьей задаче и стандартные предикаты

    Java
    1
    2
    3
    
            IntPredicate divideBy13 = a -> a % 13 == 0;
     
            Delim13 v3 = divideBy13::test;
    Запись от vcrop размещена 17.09.2023 в 11:35 vcrop вне форума
  2. Старый комментарий
    Аватар для AlexProgramm
    Цитата Сообщение от vcrop
    Нарочно так пишешь?
    Java
    1
    2
    3
    4
    
            if (value % 13 == 0)
                return true;
            else
                return false;
    Java
    1
    
            return value % 13 == 0;
    ?

    Method references в первой задаче
    Java
    1
    
    var sortByWordsLength = Comparator.comparingInt(String::length);
    Method references в третьей задаче и стандартные предикаты

    Java
    1
    2
    3
    
            IntPredicate divideBy13 = a -> a % 13 == 0;
     
            Delim13 v3 = divideBy13::test;
    Нарочно так пишешь?
    Нет, просто для себя чтоб было более понятно. Вернее даже не "понятно", а быстрее читалось подсознанием.
    Не люблю вот так: a += b;
    Более приятно для глаза вот так: а = а + b;

    Method references в первой задаче
    Не сталкивался еще с методом comparingInt() , буду знать !

    Method references в третьей задаче и стандартные предикаты
    Здесь совсем все сложно
    Не знал интерфейс IntPredicate - почитал, разобрался немного

    Не понимаю, почему здесь - Delim13 v3 = divideBy13::test; методу test ничего не передается и возвращать он ведь будет boolean!



    test(значение int)
    Вычисляет этот предикат на основе заданного аргумента.
    Параметры:
    value - входной аргумент
    ВОЗВРАТ:
    true если входной аргумент совпадает с предикатом, в противном случае false

    А, ну вроде понятно немного, ссылка на метод, здесь не нужно передаваемое значение, оно по умолчанию "а"?
    Запись от AlexProgramm размещена 17.09.2023 в 14:37 AlexProgramm вне форума
  3. Старый комментарий
    Аватар для AlexProgramm
    vcrop, спасибо за коммент!
    Запись от AlexProgramm размещена 17.09.2023 в 16:58 AlexProgramm вне форума
  4. Старый комментарий
    Аватар для AlexProgramm
    Ох, почитал еще про ссылки на методы
    Цель этого механизма как раз частично в том, что бы не передавать и не возвращать какие либо значения.

    Такое лямбда-выражение (просто вызывающее другой метод) мы можем заменить ссылкой на нужный нам метод
    . Пипец, как бы в это врубиться
    Запись от AlexProgramm размещена 17.09.2023 в 19:53 AlexProgramm вне форума
  5. Старый комментарий
    Аватар для AlexProgramm
    Ох, вот не понимаю работу метода test
    Он сравнивает данный предикат с переданным значением.
    Что такое - данный предикат?
    Написано, что этот предикат - это логическая функция.
    Тоесть сравниваем логическую функцию с переданным значением! Не понимаю, что это значит?
    Запись от AlexProgramm размещена 18.09.2023 в 00:06 AlexProgramm вне форума
  6. Старый комментарий
    Аватар для AlexProgramm
    IntPredicate
    Это функциональный интерфейс, функциональным методом которого является test(int).
    А как же остальные методы, ведь они есть, как IntPredicate может быть функциональным интерфейсом? Не понимаю

    default IntPredicate
    and(IntPredicate other)

    Возвращает составной предикат, который представляет замыкающее логическое И из этого предиката и другого.
    default IntPredicate
    negate()

    Возвращает предикат, который представляет логическое отрицание этого предиката.
    default IntPredicate
    or(IntPredicate other)

    Возвращает составной предикат, который представляет замыкающее логическое ИЛИ из этого предиката и другого.
    boolean
    test(int value)
    Вычисляет этот предикат на основе заданного аргумента.
    Запись от AlexProgramm размещена 18.09.2023 в 10:14 AlexProgramm вне форума
  7. Старый комментарий
    Аватар для AlexProgramm
    Java
    1
    2
    
    IntPredicate divideBy13 = a -> a % 13 == 0;
    Delim13 v3 = divideBy13::test;
    Какое вообще тело будет у метода test? Тело нашей лямбды? Не понимаю
    Запись от AlexProgramm размещена 18.09.2023 в 10:19 AlexProgramm вне форума
  8. Старый комментарий
    Аватар для AlexProgramm
    Вот такой пример (вообще бредятина какая то):

    2.2.1. Ссылка на статический метод вычисления объема шара
    Условие задачи. Разработать статический метод, который получает радиус шара и вычисляет объем шара. Реализовать передачу метода вычисления объема шара в другой метод в качестве параметра. Провести тестирование метода.

    Текст программы, решения данной задачи, следующий.
    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    // Ссылка на статический метод, вычисляющий объем шара
    // 1. Функциональный интерфейс, определяющий метод, который получает параметром
    //   число типа double и возвращает результат типа double
    interface ICalcFigure {
      double Volume(double radius);
    }
     
    // 2. Класс, в котором определен статический метод вычисления объема шара
    class CalcVolume {
      static double SphereVolume(double radius) {
        // повернути об'єм кулі
        return 4.0/3.0*Math.PI*radius*radius*radius;
      }
    }
     
    // 3. Класс, в котором определен метод, получающий ссылку на функциональный интерфейс
    class FigureOperation {
      double Volume(ICalcFigure ref, double radius) {
        return ref.Volume(radius);
      }
    }
     
    // 4. Класс, демонстрирущий использование ссылки на статический метод
    public class RefMethod {
     
      public static void main(String[] args) {
        // Вычислить объем шара
        // 1. Объявить экземпляр класса FigureOperation
        FigureOperation fo = new FigureOperation();
     
        // 2. Вызвать метод Volume и передать ему ссылку на статический метод
        //    Вычислить объем шара радиуса 5.0
        double volume = fo.Volume(CalcVolume::SphereVolume, 5.0);
     
        // 3. Вывести результат
        System.out.println("volume = " + volume);
      }
    }
    Почему мы не можем просто обратиться к статическому методу static double SphereVolume и не вернуть просто объем шара - return 4.0/3.0*Math.PI*radius*radius*radius;?
    Запись от AlexProgramm размещена 18.09.2023 в 11:25 AlexProgramm вне форума
  9. Старый комментарий
    Какое вообще тело будет у метода test?

    Java
    1
    
    IntPredicate divideBy13 = a -> a % 13 == 0;
    короткая запись

    Java
    1
    2
    3
    4
    5
    6
    
            IntPredicate divideBy13 = new IntPredicate() {
                @Override
                public boolean test(int a) {
                    return a % 13 == 0;
                }
            };
    Запись от vcrop размещена 18.09.2023 в 13:31 vcrop вне форума
  10. Старый комментарий
    Java
    1
    
    Delim13 v3 = a -> divideBy13.test(a);
    или

    Java
    1
    
    Delim13 v3 = divideBy13::test;
    Сюда https://docs.oracle.com/javase... ences.html,
    там табличка на четыре варианта, и снизу примеры.

    И стандартные интерфейсы
    https://docs.oracle.com/javase... mmary.html
    Запись от vcrop размещена 18.09.2023 в 13:38 vcrop вне форума
  11. Старый комментарий
    Аватар для AlexProgramm
    Цитата Сообщение от vcrop
    Java
    1
    
    Delim13 v3 = a -> divideBy13.test(a);
    или

    Java
    1
    
    Delim13 v3 = divideBy13::test;
    Сюда https://docs.oracle.com/javase... ences.html,
    там табличка на четыре варианта, и снизу примеры.

    И стандартные интерфейсы
    https://docs.oracle.com/javase... mmary.html
    Спасибо за материалы, буду изучать!
    Запись от AlexProgramm размещена 20.09.2023 в 23:12 AlexProgramm вне форума
  12. Старый комментарий
    Аватар для AlexProgramm
    Цитата Сообщение от vcrop
    Какое вообще тело будет у метода test?

    Java
    1
    
    IntPredicate divideBy13 = a -> a % 13 == 0;
    короткая запись

    Java
    1
    2
    3
    4
    5
    6
    
            IntPredicate divideBy13 = new IntPredicate() {
                @Override
                public boolean test(int a) {
                    return a % 13 == 0;
                }
            };
    Ну теперь вроде понятно
    Первое записано через лямбда-выражение?
    Второе через анонимный класс?
    Тело метода test вот - a % 13 == 0
    Запись от AlexProgramm размещена 22.09.2023 в 11:42 AlexProgramm вне форума
  13. Старый комментарий
    Аватар для AlexProgramm
    Цитата Сообщение от vcrop
    Java
    1
    
    Delim13 v3 = a -> divideBy13.test(a);
    или

    Java
    1
    
    Delim13 v3 = divideBy13::test;
    Сюда https://docs.oracle.com/javase... ences.html,
    там табличка на четыре варианта, и снизу примеры.

    И стандартные интерфейсы
    https://docs.oracle.com/javase... mmary.html
    Сложно без перевода, а перевод все искажает

    С этим тоже все понятно(по табличке) :
    Передаем ссылку на статический метод ИмяКласса:: имяСтатическогоМетода
    Передаем ссылку на не статический метод используя существующий объект имяПеременнойСОбъектом:: имяМетода
    Передаем ссылку на не статический метод используя класс, в котором реализован такой метод ИмяКласса:: имяМетода
    Передаем ссылку на конструктор ИмяКласса::new
    Запись от AlexProgramm размещена 22.09.2023 в 11:49 AlexProgramm вне форума
  14. Старый комментарий
    Давай, я тебе такую историю посоветую, чтобы ты потом написал - "изученный материал":
    https://stepik.org/course/91497/promo#toc

    Курс был от Intellij.
    Запись от vcrop размещена 23.09.2023 в 12:03 vcrop вне форума
  15. Старый комментарий
    Аватар для AlexProgramm
    Цитата Сообщение от vcrop
    Давай, я тебе такую историю посоветую, чтобы ты потом написал - "изученный материал":
    https://stepik.org/course/91497/promo#toc

    Курс был от Intellij.
    О, спасибо!
    Запись от AlexProgramm размещена 06.11.2023 в 02:01 AlexProgramm вне форума
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru