Я хочу пройти через 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. Мне жаль.
Чего вы пытаетесь достичь с помощью нерабочей версии, о которой вы спрашиваете? Рабочая версия, которую вы представляете, кажется, делает что-то совсем другое.
Вы можете получить один 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 Ваше исходное решение для цикла for также не меняет значения (на чем я основывал этот ответ). Если вы хотите изменить значения, имеет смысл использовать forEach.
Да. Извините, я забыл указать, что это другое решение, в котором я меняю значения, а не просто печатаю их. Итак, я нашел решение на основе вашего: dekodKarakterek.stream().forEach(item -> item.betu = karakterek.stream().filter(kar -> kar.felismer(item)).findFirst().map(x -> x.betu).orElse('?'));
Я узнал, что мне нужно использовать forEach, как некоторые из вас предложили здесь. Спасибо всем за помощь!
Мое решение таково:
DekodKarakterek.stream().forEach(item -> item.betu = karakterek.stream().filter(kar -> kar.felismer(item)).findFirst().map(x -> x.betu).orElse('?'));
На основе ответа @Unmitigated
Терминальной операции нет. Это фундаментальное свойство заставить поток работать. Это запах кода, который вы сопоставляете с чем-то и не заботитесь о значении, на которое вы сопоставляете. Вы хотите forEach, а не map, что ничем не отличается от обычного выполнения цикла for. Компетентная IDE предупредит вас об этих проблемах. Установите IntelliJ и используйте его поверх того, что вы используете сейчас, потому что это явно вам не поможет.