让我们假设我有一个对象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),
]
map1和map4指的是上面代码段中定义的地图。长话短说,我想要下面提到的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] 删除。
我来说两句