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

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

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

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

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 "Строки равны";
    }
    
    
}
Размещено в Без категории
Показов 791 Комментарии 14
Всего комментариев 14
Комментарии
  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 вне форума
    Обновил(-а) vcrop 17.09.2023 в 11:53
  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 вне форума
    Обновил(-а) AlexProgramm 17.09.2023 в 14:43
  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 вне форума
    Обновил(-а) AlexProgramm 18.09.2023 в 00:10
  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 вне форума
    Обновил(-а) AlexProgramm 18.09.2023 в 11:29
  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 вне форума
    Обновил(-а) AlexProgramm 22.09.2023 в 14:08
  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 размещена Вчера в 12:03 vcrop вне форума
    Обновил(-а) vcrop Вчера в 12:04
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru