Я не уверен, что это лучший подход, но в аналогичной задаче я использовал промежуточную сущность, чтобы зафиксировать изменение состояния. В вашем случае это будет что-то вроде
streamsBuilder.stream("my-topic").groupByKey()
.aggregate(DeviceState::new, new Aggregator<String, Device, DeviceState>() {
public DeviceState apply(String key, Device newValue, DeviceState state) {
if(!newValue.getStatusBit().equals(state.getStatusBit())){
state.setChanged(true);
}
state.setStatusBit(newValue.getStatusBit());
state.setDeviceId(newValue.getDeviceId());
state.setKey(key);
return state;
}
}, TimeWindows.of(…) …).filter((s, t) -> (t.changed())).toStream();
В полученной теме у вас будут изменения. Вы также можете добавить некоторые атрибуты в DeviceState, чтобы сначала инициализировать его, в зависимости от того, хотите ли вы отправить событие, когда поступит первая запись устройства и т. Д.
Еще лучше, чем троичное двойной вопросительный знак (??) оператор. Берет первое ненулевое значение. Так:
string x = null;
command.Parameters.AddParameter(
new SqlParameter("@column", (object)x ?? DBNull.Value);
дал бы Вам parm со значением DBNull. Значение, но
string x = "A String";
command.Parameters.AddParameter(
new SqlParameter("@column", (object)x ?? DBNull.Value);
Дал бы Вам parm со "Строкой" как значение.
То, что я иногда делаю, является этим:
command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value;
if( String.IsNullOrEmpty (theString) == false )
{
command.Parameters["@column"].Value = theString;
}
Возможно, тернарный оператор - что-то, что Вы находите полезными.
Nullable<T>
не может относиться String
так как это - ссылочный тип и не тип значения.
Nullable работает отлично для примитивов. Я оказываюсь перед необходимостью тестировать поведение строки, но одна опция, по крайней мере, очистить Ваш код состояла бы в том, чтобы определить дополнительный метод строки.
Можно ли использовать?? оператор для строк:
команда. Параметры. AddParameter (новый SqlParameter (" @column", myNull?? (объектный) DBNull. Значение);
?? возвращает первый объект, если это не является пустым, другое мудрое, это возвращает второй объект.
Зафиксированный код выше, таким образом, это скомпилирует Вас, должен бросить DBNull. Оцените объекту.
Я соглашаюсь, что это неуклюже и немного неудачно тот SqlParameter. Значение должно быть установлено к DbNull. Значение. Но нет никакого пути вокруг этого так, необходимо жить с тестированием на пустой указатель.