java stream 多个filter_如何在Java Stream上应用多个过滤器?
我必須通過一個映射過濾一個對象集合,該映射包含對象字段名稱和字段值的鍵值對。我試圖通過stream()。filter()應用所有過濾器。
對象實際上是JSON,因此Map保留了其變量的名稱以及它們必須包含的值才能被接受,但是出于簡單性的原因,并且由于它與問題無關,因此我編寫了一個簡單的Testclass來模擬行為:
public class TestObject {
private int property1;
private int property2;
private int property3;
public TestObject(int property1, int property2, int property3) {
this.property1 = property1;
this.property2 = property2;
this.property3 = property3;
}
public int getProperty(int key) {
switch(key) {
case 1: return property1;
case 2: return property2;
default: return property3;
}
}
}
到目前為止我嘗試過的是:
public static void main(String[] args) {
List list = new ArrayList<>();
Map filterMap = new HashMap<>();
list.add(new TestObject(1, 2, 3));
list.add(new TestObject(1, 2, 4));
list.add(new TestObject(1, 4, 3));
filterMap.put(3, 3); //Filter property3 == 3
filterMap.put(2, 2); //Filter property2 == 2
//Does not apply the result
filterMap.forEach((key, value) -> list.stream()
.filter(testObject -> testObject.getProperty(key) == value)
.collect(Collectors.toList())
);
/* Gives error: boolean can not be converted to void
list = list.stream()
.filter(testObject -> filterMap.forEach((key, value) -> testObject.getProperty(key) == value))
.collect(Collectors.toList()
);
*/
//Printing result
list.forEach(obj -> System.out.println(obj.getProperty(1) + " " + obj.getProperty(2) + " " + obj.getProperty(3)));
}
我嘗試將Map的forEach放在首位,并將Collection的流放在首位,但是兩種解決方案均無法按預期工作。此示例的期望輸出將僅是打印值為property1
= 1,property2 = 2和property3 = 3的對象。
我如何正確地應用所有過濾器,就像您在代碼中使用固定數量的過濾器一個接一個地放置它們一樣?
使用已知數量的過濾器:
list.stream().filter(...).filter(...)
編輯:
Sweeper在回答中很好地總結了我的問題,因此在這里再次為了澄清(可能是將來的讀者):我想保留所有滿足所有過濾條件的對象。
總結
以上是生活随笔為你收集整理的java stream 多个filter_如何在Java Stream上应用多个过滤器?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spark mysql 交互_Spark
- 下一篇: c语言 void**类型转换,void