Я думаю, что хорошо отметить, что основная причина, по которой ваш HashMap
не заполнен, заключается в том, что ваш код помещен в тело лямбда-выражения .Лямбда похожа на анонимный внутренний класс:
jbutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
doSomething();
}
});
Если вы определили что-то подобное, метод doSomething()
выполняется не сразу, а метод addActionListener
где-то сохраняет экземпляр ActionListener
как переменная экземпляра, поэтому она может быть использована позже.Это означает, что вы фактически определяете только метод, но еще не вызываете его.
Метод map
интерфейса Stream
(какую бы реализацию вы не использовали) принимает экземпляр Function
, который является только определением.Он только хранит этот Function
где-то, но не выполняет тело вашего лямбда-выражения.
Stream
Реализации ленивы.Они созданы для того, чтобы ничего не делать, пока они не должны.Это только тот случай, когда вызывающему на самом деле нужен некоторый результат (т. Е. Сбор).
Как только вы вызываете операцию терминала, , а затем реализация Stream фактически применяет всенеобходимые этапы преобразования и фильтрации и возвращают некоторую форму результата.
Связано:
Примечание: потоковые операции не должны иметь побочных эффектов.Это означает, что вы должны избегать таких вещей, как map1.put(key, value)
.