Вы можете сделать это без Streams, конечно, что, вероятно, сделает его немного более читабельным.
Map<Radio, Station> LOOK_UP = new HashMap<>();
List<Station> stations = ...
stations.forEach(station -> {
station.getRadios().forEach(radio -> {
LOOK_UP.put(radio, station);
});
});
Это не сильно отличается от обычного цикла с:
for (Station station : stations) {
for (Radio radio : station.getRadios()) {
LOOK_UP.put(radio, station);
}
}
Очевидная проблема здесь заключается в том, что LOOK_UP::put
всегда будет заменять значение для определенного ключа, скрывая тот факт, что у вас когда-либо были дубликаты. Например:
[StationA = {RadioA, RadioB}]
[StationB = {RadioB}]
Когда вы ищете RadioB
- что вы должны получить в результате?
Если бы у вас мог быть такой сценарий, очевидным было бы изменить определение LOOK-UP
и использовать Map::merge
:
Map<Radio, List<Station>> LOOK_UP = new HashMap<>();
List<Station> stations = new ArrayList<>();
stations.forEach(station -> {
station.getRadios().forEach(radio -> {
LOOK_UP.merge(radio,
Collections.singletonList(station),
(left, right) -> {
List<Station> merged = new ArrayList<>(left);
merged.addAll(right);
return merged;
});
});
});
Другая возможность - генерировать исключение, когда есть эти детские сопоставления:
stations.forEach(station -> {
station.getRadios().forEach(radio -> {
LOOK_UP.merge(radio, station, (left, right) -> {
throw new RuntimeException("Duplicate Radio");
});
});
});
Проблема с этим последним фрагментом заключается в том, что вы не можете зарегистрировать radio
, который следует обвинить в неуникальности. left
и right
это Stations
с. Если вы тоже этого хотите, вам нужно будет использовать слияние, которое не зависит от Map::merge
внутри, как в этот ответ.
Так что вы можете видеть, что все зависит от того, как и что именно вам нужно обрабатывать.
person
Eugene
schedule
27.10.2019
stationList.stream().forEach(station -> station.getRadioList().stream().forEach(rl -> radioToStationMap.put(rl, station)))
недостаточно хорош для вас? - person ZhenyaM   schedule 06.04.2017collect
, чем использоватьforEach
для записи в изменяемый список. - person RealSkeptic   schedule 06.04.2017