Для внутренней функции карты Arrylist в Java

Я хочу пройти через karakterek AL, и если оператор if верен, я хочу изменить значение item.betu на значение kar.betu. Я никогда не писал функцию карты с несколькими строками, поэтому не знаю, как она работает.

Последняя строка (return item.betu = '?';) здесь, потому что она выдаст мне ошибку, которую я не верну. Значение по умолчанию для item.betu — '?' поэтому я и написал это там.

Код:

dekodKarakterek.stream().map((item) -> {
            for (Karakter kar : karakterek) {
                if (kar.felismer(item)) {
                    System.out.println("Iam in");
                    return item.betu = kar.betu;
                }
                item.printKod();
            }
            return item.betu = '?';
        });

Он не запускает цикл for, поэтому он не печатает Iam in. Кроме того, если я изменю последнюю строку (return item.betu = '?';), например, на: return item.betu = 'A';, это не изменит item.betu на «A».

Я знаю, что это можно легко сделать с некоторыми циклами for, но я хочу научиться писать многострочную карту, как это сделать с помощью карты.

Вот мое рабочее решение без многострочной карты:

for (Karakter dekKar : dekodKarakterek) {
            Character[] dekodolt = karakterek.stream().filter(item -> item.felismer(dekKar))
                    .map(item -> item.betu).toArray(Character[]::new);
            if (dekodolt.length == 0) {
                System.out.print('?');
            } else {
                System.out.print(dekodolt[0]);
            }
        }
        System.out.println("");

Обновлено: я забыл включить одну очень важную вещь: «рабочее решение без многострочной карты» - это не то, что я хочу сделать. Я хотел изменить значение char в dekodKarakterek. Мне жаль.

Терминальной операции нет. Это фундаментальное свойство заставить поток работать. Это запах кода, который вы сопоставляете с чем-то и не заботитесь о значении, на которое вы сопоставляете. Вы хотите forEach, а не map, что ничем не отличается от обычного выполнения цикла for. Компетентная IDE предупредит вас об этих проблемах. Установите IntelliJ и используйте его поверх того, что вы используете сейчас, потому что это явно вам не поможет.

Michael 22.02.2023 20:59

Чего вы пытаетесь достичь с помощью нерабочей версии, о которой вы спрашиваете? Рабочая версия, которую вы представляете, кажется, делает что-то совсем другое.

John Bollinger 22.02.2023 21:13
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
1
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете получить один String результат с Collectors.joining(). Вам нужна терминальная операция, чтобы поток действительно был полностью оценен.

System.out.println(dekodKarakterek.stream().map(item -> 
    String.valueOf(karakterek.stream().filter(kar -> kar.felismer(item)).findFirst().map(x -> x.betu).orElse('?'))
).collect(Collectors.joining()));

Это наполовину хорошо для меня. Он просто печатает символы, не меняя их в dekodKarakterek. В любом случае, спасибо, вы очень повеселились!

BC_LOFASZ 22.02.2023 22:37

@BC_LOFASZ Ваше исходное решение для цикла for также не меняет значения (на чем я основывал этот ответ). Если вы хотите изменить значения, имеет смысл использовать forEach.

Unmitigated 22.02.2023 22:38

Да. Извините, я забыл указать, что это другое решение, в котором я меняю значения, а не просто печатаю их. Итак, я нашел решение на основе вашего: dekodKarakterek.stream().forEach(item -> item.betu = karakterek.stream().filter(kar -> kar.felismer(item)).findFirst().map(x -> x.betu).orElse('?'));

BC_LOFASZ 22.02.2023 22:45

Я узнал, что мне нужно использовать forEach, как некоторые из вас предложили здесь. Спасибо всем за помощь!

Мое решение таково:

DekodKarakterek.stream().forEach(item -> item.betu = karakterek.stream().filter(kar -> kar.felismer(item)).findFirst().map(x -> x.betu).orElse('?'));

На основе ответа @Unmitigated

Другие вопросы по теме