我有一个对象列表,它有3个变量(id,version,root_id)
Eg : {(1, 3, 1001),(2,2,1001), (3,1,1001), (4,1,1002), (5,1,1003)}
我想只保留一个具有相同root_id且版本号最高的对象。
output : {(1, 3, 1001),(4,1,1002), (5,1,1003)}
如何在列表中应用java流过滤器以获得所需的输出。 请帮忙。我对应用过滤器感到有些困惑。
答案 0 :(得分:3)
您需要group
rootId
max
并通过比较version
值来获取int
maxBy
。
Optional
返回collectingAndThen
数据,以解包使用的public static void main(String[] args) {
List<Data> objects = Arrays.asList(new Data(1, 3, 1001), new Data(2, 2, 1001), new Data(3, 1, 1001),
new Data(4, 1, 1002), new Data(5, 1, 1003));
Map<Integer, Data> filtered = objects.stream().collect(Collectors.groupingBy(Data::getRootId, Collectors
.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Data::getVersion)), Optional::get)));
System.out.println(filtered.values());
}
static class Data {
int id;
int version;
int rootId;
//getter,setter & constructors
//toString
}
动作数据
[Data [id=1, version=3, rootId=1001], Data [id=4, version=1, rootId=1002], Data [id=5, version=1, rootId=1003]]
输出
var _watch = null;
var test = null;
setInterval(function() {
if ( _watch !== test ) {
_watch = test;
console.log('Variable changed.', test);
}
}, 100);
答案 1 :(得分:0)
您可以使用
.stream().collect(Collectors.groupingBy(Class::property));
答案 2 :(得分:0)
.stream().filter((item) -> {
System.out.println(item); //this is element from your collection
boolean isOk = true; //change true to your conditional
return isOk;
})