如何使用Java流进行过滤

时间:2016-11-03 07:41:58

标签: java java-8 java-stream

我有一个对象列表,它有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流过滤器以获得所需的输出。 请帮忙。我对应用过滤器感到有些困惑。

3 个答案:

答案 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;
})