Здесь создается Карта, которая предоставляет метод Перехода при переходе из одного состояния в другое. Если бы это было сделано без lambdas
или streams
, это могло бы выглядеть следующим образом:
public static Map<Phase, Map<Phase, Transition>> init() {
Map<Phase, Map<Phase,Transition>> outerMap = new EnumMap<>(Phase.class);
for (Transition v : Transition.values()) {
Map<Phase, Transition> innerMap = outerMap.get(v.from);
if (innerMap == null) {
innerMap = new EnumMap<>(Phase.class);
outerMap.put(v.from, innerMap);
}
innerMap.put(v.to, v);
}
return outerMap;
}
Далее следует объяснение потока.
Начните с stream
из Transition
значения перечисления. Во всех случаях здесь t
является типом Transition
.
public static Map<Phase, Map<Phase, Transition>> map = Stream
.of(values())
Затем они собираются в EnumMap
с использованием метода Collectors.groupingBy()
. Все ключи здесь будут взяты из поля Transition.from
. Значение для этой внешней карты будет EnumMap
.collect(Collectors.groupingBy(t -> t.from,
() -> new EnumMap<>(Phase.class),
Далее, нижестоящий коллектор теперь заполняет эту вновь созданную карту другой картой. Внутренняя карта будет использовать следующее.
- Поле Transition.to для ключей -
t.to
- Результирующий тип перехода для значений, который равен просто
t
Collectors.toMap(t -> t.to, t -> t,
Этот следующий оператор является просто функцией слияния, и он не используется в данном конкретном приложении, поэтому просто выбрал значение.
(x, y) -> x,
Наконец, укажите Supplier
для тип innerMap
для создания.
() -> new EnumMap<>(Phase.class))));
Когда Transition.from()
вызывается с использованием аргументов из перечисления Phase
, на карту ссылаются для отображения процесса Transition
.