如何在流上重用过滤器和地图的应用?
我有一组从共享类型(即 , )继承的域对象。子类型具有特定属性(即 、 )。GroupRecord extends Record
RequestRecord extends Record
GroupRecord::getCumulativeTime
RequestRecord::getResponseTime
此外,由于解析日志文件,我有一个具有混合子类型的记录列表。
List<Record> records = parseLog(...);
为了计算日志记录的统计信息,我想仅对与特定子类型匹配的记录子集(即仅在 s 上)应用数学函数。因此,我希望有一个特定子类型的过滤流。我知道我可以使用GroupRecord
filter
map
records.stream()
.filter(GroupRecord.class::isInstance)
.map(GroupRecord.class::cast)
.collect(...
在流上多次应用此 filter&cast(尤其是当对同一子类型多次执行此筛选器以进行不同计算时)不仅很麻烦,而且会产生大量重复。
我目前的方法是使用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(...)
它有效,但我发现这种方法对于如此简单的任务来说有点多。因此,我想知道,有没有更好或最好的方法,使这种行为以简洁易读的方式使用流和函数可重用?