使用另一个Hash map Java中给出的过滤条件过滤Hash map列表

Plasmatiger:

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

Class P {
    int id;
    Map<String,String> value;
}

值看起来像

value = {
    "Category" : "Category 1",
    "family" : "Family 1",
    "color" : "Color 1"
}

如上所述,我有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),
]

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

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

过滤后,显然,输出将是

List<P> listP = [
    P(1, map1),
    P(4, map4),
]

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())]

如评论中所建议,我为类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());

样品

{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}

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

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

清醒:

假设您输入的数据如下

List<Product> products = Arrays.asList(first, second, ..);

您的过滤器地图是

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

filters.put("color", "xyz");

那么您可以使用此过滤器。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在另一个Map Java中迭代一个Map

如何在 Java 中将一个 Map 放入另一个 Map

通过其值过滤Map对象,而无需将结果收集到另一个map中

使用来自purrr的map提取以另一个变量为条件的值

如何使用map和forEach反转另一个数组中的布尔数组?

在Java 8中,如何使用lambda将Map <K,V>转换为另一个Map <K,V>?

在C#中,如何使用另一个列表的StartsWith()条件过滤列表?

在一个循环或两个单循环的hash map的hash map中输入数据

Java8生成包含另一个Map的Map

并发写入包含Golang中另一个Map的Map

是否可以将 map 方法实现到另一个 map 方法中?

使用Java 8如何根据过滤条件按列表和分组进行过滤,并将其计数转换为Map

列表中的渲染列表(在Map中使用Map)

使用另一个类的 Map Fragment

如何使用另一个列表过滤列表?

在Scala中,如何检查一个Map是否包含另一个Map的所有条目?

Python使用另一个列表中的元素过滤出一个列表

Java 8过滤基于Map属性的Map对象列表,以删除一些重复项

使用 Java 8 中的另一个列表过滤对象列表

Python使用map()遍历列表中的列表

使用Java 8 Streams的Hash Map对象列表迭代

如何遍历另一个 Map 内的 Map?

如何将一个 Map 中的 K 和另一个 Map 中的 V 写入一个文件?

如何使用另一个列表的 id 过滤一个列表?

使用Java8使用另一个列表过滤列表

将java.util.map传递给另一个活动

根据另一个地图中的值对 Java Map 进行排序

Mockito,JUnit和Map嵌套在另一个类中

如何根据 Spring Data JPA 中另一个属性的值返回 Map?