Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 6

Преобразование в лямбду

21.03.2019, 18:44. Показов 1922. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Hello World!
Дано условие.

Создайте лямбду isIllegalString, принимающую множество символов и строку, проверяющую, содержит ли строка символы не из множества.

Примеры:
isIllegalString.test(Set.of('a', 'b'), "abc") == true
isIllegalString.test(Set.of('a', 'b'), "ab") == false

Написал обычный метод без этих ваших лямбд.

Java
1
2
3
4
5
6
7
 static  boolean solution (char[] ch, String str) {
        char[] strToChar = str.toCharArray();
        if (Arrays.equals(strToChar, ch)) {
            return false;
        }
        return true;
    }
Как это в лямбду-то преобразовать ? Что за Set.of такой в примере ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2019, 18:44
Ответы с готовыми решениями:

Необходимо составить лямбду
Значит есть вот такой код: string turn = ""; if (whichTurnIs == 2) turn = "0"; else turn = "X"; listOfButtons.Text = turn;...

Выносить ли лямбду из цикла?
var lambda = x => x <= 10; for (var i = 0; i < N; i++) { doSomething(i, lambda); } или for (var i = 0; i < N; i++) { ...

Компилятор не понимает лямбду в классе
Здравствуйте! Столкнулся с внутренней ошибкой компилятора. Я хочу вычислить нормировочную постоянную для функции плотности. Для этого я...

9
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
21.03.2019, 20:37
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Arrays;
 
public class Lambda {
    static IsIllegalString isIllegalString = (o1, o2) -> o1 != null && o2 != null && !Arrays.equals(o1, o2.toCharArray());
 
    public static void main(String[] args) {
        System.out.println(isIllegalString.test(new char[]{'a', 'b'}, "abc"));
        System.out.println(isIllegalString.test(new char[]{'a', 'b'}, "ab"));
    }
 
    @FunctionalInterface
    interface IsIllegalString {
        boolean test(char[] symbols, String offer);
    }
}
Добавлено через 3 минуты
Set.of введён в java 10. Я пока на 8-й сижу

Добавлено через 5 минут
https://docs.oracle.com/javase... l/Set.html

Добавлено через 51 минуту
или вот реализовано со множествами типа Set:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
 
public class Lambda {
    private static IsIllegalString isIllegalString = (o1, o2) -> o2.chars().
            mapToObj(c -> new Character((char) c)).
            filter(c -> !o1.contains(c)).count() != 0;
 
    public static void main(String[] args) {
        System.out.println(isIllegalString.test(new HashSet<>(Arrays.asList(new Character[]{'a', 'b'})), "abc"));
        System.out.println(isIllegalString.test(new HashSet<>(Arrays.asList(new Character[]{'a', 'b'})), "ab"));
    }
 
    @FunctionalInterface
    interface IsIllegalString {
        boolean test(Set<Character> symbols, String offer);
    }
}
Добавлено через 29 минут
можно ещё так выйти из положения:

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
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
 
public class Lambda {
    private static IsIllegalString isIllegalString = (o1, o2) -> o2.chars().
            mapToObj(c -> (char) c).
            filter(c -> !o1.contains(c)).count() != 0;
 
    public static void main(String[] args) {
        System.out.println(isIllegalString.test(MySet.of('a', 'b'), "abc"));
        System.out.println(isIllegalString.test(MySet.of('a', 'b'), "ab"));
    }
 
    @FunctionalInterface
    interface IsIllegalString {
        boolean test(Set<Character> symbols, String offer);
    }
 
    private static class MySet {
        private static <E> Set<E> of(E... elements) {
            Set<E> set = new HashSet<>();
            Collections.addAll(set, elements);
            return set;
        }
    }
}
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 6
21.03.2019, 20:39  [ТС]
Ого ! Спасибо большое. Ну и где тут лаконичность кода, которая должна достигаться благодаря лямбда выражениям ? Это же в методе в пару строк проверяется. В чем сакральный смысл этих лямбд ?
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
21.03.2019, 20:56
во первых Arrays.equals сравнивает массивы, но по задаче этого мало
во вторых, тебе нужно не массив char а множества типа Set
в третьих была бы Java 10, то не пришлось бы городить

лаконичность есть, т.к. сокращает код в одну строчку... А интерфейс ты можешь переиспользовать

Попробуй реализуй эту задачу методом... Который принимает Set<Character> и String и смотрит, чтоб в стринге были символы, которых нет в Set

Добавлено через 11 минут
вот разница тебе:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public static boolean test(Set<Character> symbols, String offer) {
        for (char symbol : offer.toCharArray()) {
            if (!symbols.contains(symbol)) {
                return true;
            }
        }
        return false;
    }
    
    //или
    
    public static boolean test(Set<Character> symbols, String offer) {
        return offer.chars().filter(c -> !symbols.contains((char) c)).count() != 0;
    }
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 6
21.03.2019, 21:05  [ТС]
Это со стримами ? Стримы мы вроде как еще не проходили.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
21.03.2019, 21:14
Вот пример тебе лямбд... Калькулятор в 4 строки:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.function.BinaryOperator;
 
public class Calculator {
    public static BinaryOperator<Integer> sum = (o1, o2) -> o1 + o2;
    public static BinaryOperator<Integer> min = (o1, o2) -> o1 - o2;
    public static BinaryOperator<Integer> multi = (o1, o2) -> o1 * o2;
    public static BinaryOperator<Integer> div = (o1, o2) -> o1 / o2;
}
 
class TestCalculator {
    public static void main(String[] args) {
        int x = 5;
        int y = 5;
 
        System.out.println(Calculator.sum.apply(x, y));
        System.out.println(Calculator.min.apply(x, y));
        System.out.println(Calculator.multi.apply(x, y));
        System.out.println(Calculator.div.apply(x, y));
    }
}
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 6
21.03.2019, 21:18  [ТС]
Калькулятор да, лаконичный. Это было проще всего написать на лямбдах.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
21.03.2019, 21:35
вот ещё пример без лямбд:

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
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
 
public class Sample {
    static Comparator<User> sortName = new Comparator<User>() {
        @Override
        public int compare(User o1, User o2) {
            return o1.getName().compareTo(o2.getName());
        }
    };
 
    static Comparator<User> sortLogin = new Comparator<User>() {
        @Override
        public int compare(User o1, User o2) {
            return o1.getLogin().compareTo(o2.getLogin());
        }
    };
 
    static Comparator<User> sortPassword = new Comparator<User>() {
        @Override
        public int compare(User o1, User o2) {
            return o1.getPassword().compareTo(o2.getPassword());
        }
    };
 
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("Petr", "Petruchi", "qwerty"));
        list.add(new User("Dima", "Balbes", "123456"));
        list.add(new User("Sergey", "Hatab", "asdfgh"));
 
        System.out.println("\nWithout sort:");
        list.forEach(System.out::println);
 
        System.out.println("\nSort by name:");
        list.sort(sortName);
        list.forEach(System.out::println);
 
        System.out.println("\nSort by login:");
        list.sort(sortLogin);
        list.forEach(System.out::println);
 
        System.out.println("\nSort by password:");
        list.sort(sortPassword);
        list.forEach(System.out::println);
    }
}
 
class User {
    private String name;
    private String login;
    private String password;
 
    public String getName() {
        return name;
    }
 
    public String getLogin() {
        return login;
    }
 
    public String getPassword() {
        return password;
    }
 
    public User(String name, String login, String password) {
        this.name = name;
        this.login = login;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return String.format("%s: login: %s; pass: %s", this.name, this.login, this.password);
    }
}
Добавлено через 2 минуты
или с лямбдами:

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
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
 
public class Sample {
    static Comparator<User> sortName = (o1, o2) -> o1.getName().compareTo(o2.getName());
    static Comparator<User> sortLogin = (o1, o2) -> o1.getLogin().compareTo(o2.getLogin());
    static Comparator<User> sortPassword = (o1, o2) -> o1.getPassword().compareTo(o2.getPassword());
 
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("Petr", "Petruchi", "qwerty"));
        list.add(new User("Dima", "Balbes", "123456"));
        list.add(new User("Sergey", "Hatab", "asdfgh"));
 
        System.out.println("\nWithout sort:");
        list.forEach(System.out::println);
 
        System.out.println("\nSort by name:");
        list.sort(sortName);
        list.forEach(System.out::println);
 
        System.out.println("\nSort by login:");
        list.sort(sortLogin);
        list.forEach(System.out::println);
 
        System.out.println("\nSort by password:");
        list.sort(sortPassword);
        list.forEach(System.out::println);
    }
}
 
class User {
    private String name;
    private String login;
    private String password;
 
    public String getName() {
        return name;
    }
 
    public String getLogin() {
        return login;
    }
 
    public String getPassword() {
        return password;
    }
 
    public User(String name, String login, String password) {
        this.name = name;
        this.login = login;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return String.format("%s: login: %s; pass: %s", this.name, this.login, this.password);
    }
}
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
21.03.2019, 22:53
Цитата Сообщение от home30 Посмотреть сообщение
Ну и где тут лаконичность кода, которая должна достигаться благодаря лямбда выражениям ? Это же в методе в пару строк проверяется. В чем сакральный смысл этих лямбд ?
Цитата Сообщение от home30 Посмотреть сообщение
Стримы мы вроде как еще не проходили.
А лаконичность кода в том что вы можете вставлять лямбды прямо в стримы. Более того вы можете иметь "заготовленные" лямбды. Можно использовать одну лямбду много раз, и даже когда она в разных примерах должна по разному работать, внутрь ее можно передавать разный код (реализацию других лямбд). Но это уже в более сложных примерах.
Вот по вашему примеру :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Set;
import java.util.function.BiPredicate;
 
public class UniqueSymbols{
 
    public static void main(String[] args){
        BiPredicate<Set<String>, String> isIllegalString = (o1, o2) -> o1.stream().reduce("",(x1, x2) -> o2.contains(x1) && o2.contains(x2)? "":"net").isEmpty();
        String str = "stroka";
        System.out.println(isIllegalString.test(Set.of("s","t","r","o","k","a"),str));
        System.out.println(isIllegalString.test(Set.of("s","t","r"),str));
        System.out.println(isIllegalString.test(Set.of("s","t","r","o","ch","k","a"),str));
    }
}
0
0 / 0 / 0
Регистрация: 21.03.2019
Сообщений: 6
21.03.2019, 23:03  [ТС]
А вы случаем обучением или менторством по джаве не занимаетесь ? Так подробно и понятно мне еще никто не объяснял )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2019, 23:03
Помогаю со студенческими работами здесь

Развертывание параметров через лямбду
где-то видел подобноеtemplate&lt;class ...A&gt; void println(A...arg){ int showup{ (std::cout&lt;&lt;arg,0)... }; std::cout &lt;&lt;...

Как правильно написать лямбду?
Наклепал такой макрос: #define QTREEITEM(itemIndex, ok) \ (int _itemIndex, bool *_ok) -&gt; QTreeWidgetItem* { \ ...

Одноканальная СМО. Как найти лямбду?
Автозаправочная станция (АЗС) представляет собой СМО с одним каналом обслуживания (одной колонкой). Площадка при станции допускает...

Как правильно прописать лямбду в М-файле
как правильно прописать лямбду в М-файле? function f= F(t,x) x1=x(1)- lambda*x(2); x2=x(2)- lambda*x(1); f=; end

Возврат массива строк в константу через лямбду
Люди памагите, уже час туплю:) const char* arrow_icon = &quot;--&gt;&quot;; struct { char operator()() { int length = 0; char *space; for ( int i...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru