使用另一个哈希映射 Java 中给出的过滤条件过滤哈希映射列表

Pla*_*ger 1 java collections functional-programming hashmap java-stream

让我们假设我有一个对象 P 的列表。

Class P {
    int id;
    Map<String,String> value;
}
Run Code Online (Sandbox Code Playgroud)

一个值看起来像

value = {
    "Category" : "Category 1",
    "family" : "Family 1",
    "color" : "Color 1"
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我有 P 的列表。假设该列表是 listP。

map1 = {
    "Category" : "Category 1",
    "family" : "Family 1",
    "color" : "Color 1"
}
map2 = {
    "Category" : "Category 2",
    "family" : "Family 2",
    "color" : "Color 1"
}
map3 = {
    "Category" : "Category 1",
    "family" : "Family 1",
    "color" : "Color 2"
}
map4 = {
    "Category" : "Category 2",
    "family" : "Family 1",
    "color" : "Color 1"
}
List<P> listP = [
    P(1, map1),
    P(2, map2),
    P(3, map3),
    P(4, map4),
]
Run Code Online (Sandbox Code Playgroud)

我想过滤各种条件。条件是地图的形式。

filter = {
   "color" : "Color 1",
   "family" : "Family 1"
}
Run Code Online (Sandbox Code Playgroud)

过滤后,很明显,输出将是

List<P> listP = [
    P(1, map1),
    P(4, map4),
]
Run Code Online (Sandbox Code Playgroud)

map1map4指的是上面代码片段中定义的地图。长话短说,我想要下面提到的 Python 代码的替代品(它不是针对这些类,但想法是相同的。

filterC = {
    "color" : "Color 1",
    "family" : "Family 1"
}

inputL = [
    {
        "Category" : "Category 1",
        "family" : "Family 1",
        "color" : "Color 1"
    },
    {
        "Category" : "Category 1",
        "family" : "Family 1",
        "color" : "Color 2"
    },
    {
        "Category" : "Category 1",
        "family" : "Family 2",
        "color" : "Color 1"
    },
    {
        "Category" : "Category 2",
        "family" : "Family 1",
        "color" : "Color 1"
    },
]

outputL = [inp for inp in inputL if all(inp[k] == v for k,v in filterC.items())]
Run Code Online (Sandbox Code Playgroud)

正如评论中所建议的,我已经为Product 类的value属性添加了我的代码和示例值(上面称为 P)

Map<String, String> filter = new HashMap<String, String>();
        filter.put("Category","7018");
        filter.put("Carbon","0.075");

        List<Product> productList= productRepository.findAll();


        List<Product> prodList = productList.stream()
                .filter(prod -> filter.entrySet().stream().allMatch(e -> prod.getValue().get(e.getKey()) == e.getValue()))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

样本

{Category=7018, Hydrogen=5, Moisture=0.3, Product Name=New Product, Ferrite (Fn)=, Vanadium=0.025, Phosphorus=0.0175, Hardness=, Carbon=0.075, Molybdenum=0.1, UTS=550, Columbium=, Chromium=0.1, YS=200, Nickel=0.15, Silicon=0.375, Hardness_Scale=HRC, Sulfur=0.0175, Copper=, Elongation=11, Manganese=0.8}
Run Code Online (Sandbox Code Playgroud)

我可以使用普通循环和基本 lambda 来完成任务,但我无法使用过滤器和收集。任何方向的帮助将不胜感激。我遵循了一些教程,但在函数式编程方面,我是 Java 的新手。提前致谢。

编辑 - 将 P 中的 id 从 String 转换为 int 以避免混淆。与怀疑无关,只是为了清楚起见

luc*_*cid 5

假设您有如下输入数据

List<Product> products = Arrays.asList(first, second, ..);
Run Code Online (Sandbox Code Playgroud)

你的过滤器地图是

Map<String, String> filters = new HashMap<>();

filters.put("color", "xyz");
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它进行过滤。

List<Product> data = products
  .stream()
  .filter(element -> filter.entrySet()
            .stream()
            .allMatch(criteria -> Objects.equals(criteria.getValue(), 
                            element.getValue().get(criteria.getKey()))))
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)