У меня есть набор объектов домена, которые наследуются от общего типа (т.е. GroupRecord extends Record
, RequestRecord extends Record
). Подтипы имеют специфические свойства (т.е. GroupRecord::getCumulativeTime
, RequestRecord::getResponseTime
).
Кроме того, у меня есть список записей со смешанными подтипами в результате анализа файла журнала.
List<Record> records = parseLog(...);
Чтобы вычислить статистику записей журнала, я хочу применить математические функции только к подмножеству записей, которые соответствуют определенному подтипу, т.е. только на GroupRecord
s. Поэтому я хочу иметь отфильтрованный поток определенных подтипов. Я знаю, что я могу применить filter
и map
к подтипу, используя
records.stream()
.filter(GroupRecord.class::isInstance)
.map(GroupRecord.class::cast)
.collect(...
Применять этот фильтр и поток в потоке несколько раз (особенно при выполнении одного и того же подтипа несколько раз для разных вычислений) не только громоздко, но и создает много дублирования.
Мой текущий подход заключается в использовании TypeFilter
class TypeFilter<T>{
private final Class<T> type;
public TypeFilter(final Class<T> type) {
this.type = type;
}
public Stream<T> filter(Stream<?> inStream) {
return inStream.filter(type::isInstance).map(type::cast);
}
}
Для применения к потоку:
TypeFilter<GroupRecord> groupFilter = new TypeFilter(GroupRecord.class);
SomeStatsResult stats1 = groupFilter.filter(records.stream())
.collect(...)
SomeStatsResult stats2 = groupFilter.filter(records.stream())
.collect(...)
Это работает, но я нахожу этот подход немного большим для такой простой задачи. Поэтому я задаюсь вопросом, есть ли лучшее или что является лучшим способом для повторного использования этого поведения с использованием потоков и функций в сжатом и понятном виде?