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)
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())]
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 以避免混淆。与怀疑无关,只是为了清楚起见
假设您有如下输入数据
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)