Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
84
 Аватар для 84
28 / 33 / 12
Регистрация: 11.04.2016
Сообщений: 132

Лямбда выражения

17.08.2016, 14:41. Показов 2984. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одной теме https://www.cyberforum.ru/java-j2se/thread1794469 пользователь xoraxax показал код
Java
1
2
3
4
5
6
7
8
9
10
    private static final int[] a = {1,2,3,4,5,6,7,8,9,10};
    private static final int size=a.length;
   
    public static void main(String[] args) {
        List<Integer> l = new LinkedList<>();
        Arrays.stream(a).forEach(i->l.add(i));
        l.removeIf(i->i%2==0);
        while (l.size()<size) l.add(0);
        System.out.println(l);
    }
Код убирает все четные элементы из массива и заполняет в конец нулями до прежнего размера массива.
Собственно вопрос по самим лямбда выражениям.
На сколько я понимаю для использования лямбда выражений нужен функциональный интерфейс. Собственно где он? =)
Если кому не сложно - по пути разжуйте "на пальцах" как оно работает xD
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.08.2016, 14:41
Ответы с готовыми решениями:

Лямбда выражения
Добрый день, помогите, пожалуйста с лямбдой. Нужно переписать вот это: public static boolean CheckingString(String string) { ...

Лямбда-выражения в Java
Подскажите пожалуйста, как переписать следующий класс с использованием лямбда-выражений? Хотя бы некоторые методы. import java.io.*; ...

Конструкторы и лямбда выражения
Добрый день. Появился вопрос при изучении лямбда выражений и ссылок на конструкторы. Пример из книги: interface MyFunc{ MyClass func...

9
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
17.08.2016, 15:08
Java
1
2
public void forEach(Consumer<? super E> action)
Interface Consumer
0
84
 Аватар для 84
28 / 33 / 12
Регистрация: 11.04.2016
Сообщений: 132
17.08.2016, 15:32  [ТС]
vcrop, спасибо, так стало на много лучше
0
11 / 2 / 0
Регистрация: 20.07.2016
Сообщений: 35
17.08.2016, 15:39
Ммм. На сколько я знаю лямбда-выражения это штука, которая является одновременно и объявлением и вызовом метода без присвоения ему имени.
Методы коллекций forEach() и removeIf() требуют в качестве аргумента лямбда-выражения.
Тот же самый метод forEach() можно использовать вот так:
Java
1
2
ArrayList<String> arrList = new ArrayList<>();
arrList.forEach(s -> s.trim());
или так:
Java
1
2
3
ArrayList<String> arrList = new ArrayList<>();
//Для каждой строки коллекции добавить к ней "а".
arrList.forEach(s -> s += "a");
Т.е. тут мы по факту говорим "возьми каждый элемент массива и сделай с ним бла".

Еще эти выражения можно использовать так. Есть класс "Стол":
Java
1
2
3
4
5
6
7
8
public class Table {
    
    int weight;
    
    public Table(int weight){
        this.weight = weight;
    }
}
Если мы хотим получить суммарный вес всех столов на складе, то можно сделать это при помощи лямбд так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.ArrayList;
import java.util.Random;
 
public class main {
    
    public static ArrayList<Table> 
    
    public static void main(String[] args) {
        
        arr = new ArrayList<>();
        //Просто сделали 100 столов
        for (int i = 0; i < 100; i++) {
            arr.add(new Table(5));
        }
        int weightAllTables = arr.stream().map(Table -> Table.weight).reduce(0, (weight1, weight2) -> weight1 + weight2);
        
        System.out.println(weight);
    }
}
Этот код выше можно расшифровать так:
вес - int weght - равен взять коллекцию (arr)
Сделать из ее элементов поток stream()
Методом map() выбрать из каждого объекта Table указанную его переменную map(Table -> Table.weight)
Потом при помощи метода reduce() сложить все элементы потока. Метод reduce() расшифровывается как:
reduce(%начальное_значение_у_нас_0%, (%первая_переменная%, %вторая_переменная%) -> %что_мы_с_ними_делаем%);

То же самое можно запустить в несколько параллельных потоках. Для этого надо вместо stream() вызвать метод parallelStrem().

Как-то так.

Добавлено через 2 минуты
Сам пока не сильный спец в лямбдах и функциональном программировании, так что если что не понятно спрашивайте.
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
17.08.2016, 17:35
Цитата Сообщение от Zelmm Посмотреть сообщение
Методы коллекций forEach() и removeIf() требуют в качестве аргумента лямбда-выражения.
Ничего подобного. Эти методы требуют экземпляры классов, определённых в сигнатуре методов.

Лямбда - синтаксический сахар для создания экземпляра анонимного класса, имплементирующего интерфейс, у которого нужно определить поведение одного метода.

Именно определить, интерфейс может содержать сколько угодно методов с имплементацией по умолчанию.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.08.2016, 17:36
Цитата Сообщение от Zelmm Посмотреть сообщение
лямбда-выражения это штука, которая является одновременно и объявлением и вызовом метода без присвоения ему имени.
нет. Это анонимная имплементация функционального интерфейса. По-сути синтактический сахар
Цитата Сообщение от Zelmm Посмотреть сообщение
Методы коллекций forEach() и removeIf() требуют в качестве аргумента лямбда-выражения.
тоже нет. Они принимают переменную типа интерфейса.
В джава нет такого типа данных "ламбда"
0
11 / 2 / 0
Регистрация: 20.07.2016
Сообщений: 35
18.08.2016, 09:20
aleksandy и KEKCoGEN, ничего не хочу сказать плохого, вы молодцы, что указываете на ошибки подрастающим программистам и говорите, как правильно. Но есть два но:
1.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Цитата Сообщение от Zelmm Посмотреть сообщение
лямбда-выражения это штука, которая является одновременно и объявлением и вызовом метода без присвоения ему имени.
нет. Это анонимная имплементация функционального интерфейса. По-сути синтактический сахар
Это объяснение я взял вот отсюда: Java 8 Для чайников. Данная книга сейчас лежит у меня на столе и на моем пути становления как Junior'а она мне очень помогла своей простотой и низки порогом входа в язык.
И как мне кажется, это определение довольно не плохо отражает суть того, что делают лямбда-выражения. Заметьте, не того, чем являются лямбда-выражения на самом деле, а того, что получается в результате их действия. Может быть я и тут не прав. В таком случае поправьте меня пожалуйста.
2. Вы, рассматривая данную ситуацию с высоты своего опыта и знаний, должны были заметить, что в данной теме один не опытный участник сообщества отвечал другому неопытному. И вместо того, чтобы обоим объяснить, как и просили вначале, "на пальцах", говорите, что второй не прав, говорите много терминов и вопрос остается открытым: если я не прав, тогда что такое лямда-выражения "на пальцах"?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.08.2016, 09:42
Zelmm, давайте не разводить демагогию. В этой теме уже достаточно ответов что такое ламбда и что она делает.
0
65 / 64 / 15
Регистрация: 15.12.2013
Сообщений: 166
18.08.2016, 10:07
Лучший ответ Сообщение было отмечено 84 как решение

Решение

Zelmm, предположим, у нас есть интерфейс Operationable с одним единственным методом calculate(), чтобы его реализовать, нужно было вызвать конструкцию ниже.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LambdaApp {
 
    public static void main(String[] args) {
         
        Operationable op = new Operationable(){
         
            public int calculate(int x, int y){
             
                return x + y;
            }
        };
         int z = op.calculate(20, 10);
    }   
}
interface Operationable{
    int calculate(int x, int y);
}
Так как подобные интерфейсы в проектах встречаются часто, разработчики Java решили, что будет проще сократить конструкцию имплементации до
Java
1
2
3
4
5
6
7
public static void main(String[] args) {
         
        Operationable operation;
        operation = (x,y)->x+y;
         
        int result = operation.calculate(10, 20);
    }
Это они и назвали лямбдой. По факту, ничего нового в язык это не привнесло, кроме сокращение строк кода.
Можешь посмотреть видео от Оракл разработчиков, где они подробно объясняют принцип лямбда выражений - "Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам"
2
11 / 2 / 0
Регистрация: 20.07.2016
Сообщений: 35
18.08.2016, 10:20
KEKCoGEN, ок, демагогию разводить не буду. Все равно Вы меня так и не поняли.

Эрнесто, спасибо огромное! Вы объяснили предельно понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2016, 10:20
Помогаю со студенческими работами здесь

Лямбда-выражения и ссылки на методы
Господа, может кто-нибудь подсказать доступную инфу по лямбда-выражениям и ссылкам на методы. В большинстве статей в инете, все слишком...

Лямбда выражения для сортировки коллекции
Изучаю лямбда-выражения в Java. Возник вопрос, как отсортировать список сотрудников, например: Виктор Рязанов 95000 20.03.2017 ...

Лямбда выражения, проверка правила согласно логике в объекте
Здравствуйте, есть задача вида: &quot;Написать метод: public void showStudent(Student s, Show rule). Выводящий на экран имена студентов из...

Лямбда-функция
Можно ли в этот код добавить хоть одну лямбда-функцию? ...

Лямбда выражение
Список dest содержит информацию о ценах на перелеты в виде субтитров: port_wylety port_prilety cena_w_EUR Необходимо создать список...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru