Я должен фильтровать коллекцию объектов по карте, в которой содержатся пары ключевых значений имен полей объектов и значений полей. Я пытаюсь применить все фильтры с помощью 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<TestObject> list = new ArrayList<>();
Map<Integer, Integer> 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)));
}
Сначала я попытался сначала перенести карту First и первую коллекцию, но оба решения не работали должным образом. Желательным результатом этого примера будет только печать объекта со значениями property1 = 1, property2 = 2 и property3 = 3.
Как я могу применить все фильтры правильно, как если бы вы поместили их один за другим в код с фиксированным количеством фильтров?
При известном количестве фильтров:
list.stream().filter(...).filter(...)
Редактировать:
Sweeper очень хорошо подвел мой вопрос в своем ответе, поэтому просто для разъяснения (и, вероятно, будущих читателей) здесь: я хочу сохранить все объекты, удовлетворяющие всем фильтрам.