Я пытался немного обойти этот очень уродливо выглядящий фрагмент кода в моей кодовой базе.
Исходный код выглядит так:
Код: Выделить всё
Long variable = Optional.of(message)
.map(Message::getPayload)
.map(MessageContentClass::getVariable)
.orElse(null);
Поскольку это повторялось много раз в базе кода, это меня очень раздражало. Мне уже удалось упростить это до такой функции:
Код: Выделить всё
public T getVariableFromMessage(Message message, Function func) {
return Optional.of(message)
.map(Message::getPayload)
.map(func)
.orElse(null);
}
и это прекрасно работает. Однако есть также некоторые типы сообщений, в которых желаемая переменная вложена немного глубже в сообщение. Что-то вроде:
Код: Выделить всё
Long variable = Optional.of(message)
.map(Message::getPayload)
.map(MessageContentClass::getObject1)
.map(Object1::getObject2)
.map(Object2::getVariable)
.orElse(null);
Я даже не знаю, возможно ли это, но было бы неплохо сгенерировать первые функции, чтобы у меня был (вместо одной Function) массив функций, где каждая «указывает» на тип следующей, чтобы первая карта шла от K -> T, вторая от T -> R и так далее, пока не дойдет до финальной. Я видел объявления методов, где общий тип вводится ВНЕ угловых скобок, так что, возможно, что-то в этом роде? Также ясно, что то, что я ищу, будет работать для любого количества функций. Если бы мне нужно было только два или три, я мог бы просто привести их по отдельности в качестве аргументов.
Надеюсь, мне понятно, что я пытаюсь сделать, и спасибо, что прочитали весь пост
Подробнее здесь:
https://stackoverflow.com/questions/790 ... e-sequence