Возможна ли условная композиция Потребителей в Java 8? В основном я ищу создать пользовательский интерфейс Lambda, похожий на Consumer, но который работает только с одним типом объекта. Давайте назовем это, Stateful
и содержит несколько статусов (мы скажем два для этого примера):Java 8 Пользовательский потребитель
public class Stateful {
private int status1;
private int status2;
}
У нас есть много областей, в нашем коде, где мы делаем операцию на Stateful и, если статус изменился, мы сделали бы еще одну операцию. Мне было интересно, можем ли мы использовать композицию, чтобы справиться с этим более компактным и элегантным образом. Сейчас мы будем делать что-то вроде:
SimpleEntry<Integer, Integer> oldStates = new SimpleEntry(stateful.getStatus1(), stateful.getStatus2());
applyLogicOnStateful(stateful); //do some operation that may change state values
if(isStatusChanged(oldStates, stateful) { //compare oldStates integers to status integers
doSomethingElse(stateful);
}
, где я думаю, что-то, как это будет выглядеть лучше:
statefulConsumer
.accept((stateful)->applyLogicOnStateful(stateful))
.ifStatusChanged((stateful)->doSomethingElse(stateful));
, но я не знаю, если мы сможем отслеживать изменение состояния от перед первым потребителем после. Возможно, мне нужно создать лямбду, которая принимает двух потребителей в качестве входных данных?
Я определенно хочу сделать это без помощи сторонней библиотеки, хотя вы можете продвигать ее здесь, если это полезно.
«Компактный и элегантный» способ сделать это в вашем первом например, используя совершенно нормальный, читаемый оператор 'if'. –
Я почтительно не согласен: нужно сохранить состояние переменной, сделать некоторую логику, а затем сделать сравнение громоздкой и определенно не СУХОЙ. Я полагаю, что у меня может быть модифицированный потребитель, который возвращает логическое значение, если статус изменяется. – IcedDante
Я думаю, что единственный способ сделать это - если ваш applyLogicOnStateful возвращает логическое значение, если ваш статус изменился, или если вы создаете предикат с ожидаемыми значениями, прежде чем вызывать все ваши операции (что то же самое, что вы делаете сейчас, просто более элегантно) –