Java 匹配两个多值映射并检索值
Java 匹配两个多值映射并检索值,java,dictionary,java-8,java-stream,Java,Dictionary,Java 8,Java Stream,多值地图数据检查 多值dmap输入数据 我需要将dataToCheck的键与inputData匹配 然后将dataToCheck的值与inputData匹配 如果值匹配,则检索浮点值。我想在第一场比赛中退出 可以使用一个键匹配退出 float compareMap(多值dmap dataToCheck,多值dmap inputData){} 编辑: 多值dmap来自Jax-Rs() 这就是我想到的。我知道我可以使用过滤器,但我不知道如何使它工作 float sampleValue = n
多值地图数据检查代码>
多值dmap输入数据代码>
我需要将dataToCheck的键与inputData匹配
然后将dataToCheck的值与inputData匹配
如果值匹配,则检索浮点值。我想在第一场比赛中退出
可以使用一个键匹配退出
float compareMap(多值dmap dataToCheck,多值dmap inputData){}
编辑:
多值dmap来自Jax-Rs()
这就是我想到的。我知道我可以使用过滤器,但我不知道如何使它工作
float sampleValue = new float[1];
dataToCheck.keySet().stream().forEach(field -> {
List<String> inputValues = inputData.get(field);
List<Pair<String, Float>> checkValues = dataToCheck.get(field);
if (checkValues != null && inputValues != null) {
checkValues.stream().forEach(value -> {
for (String inp : inputValues) {
if (value.getLeft().equalsIgnoreCase(inp)) {
sampleValue[0] = value.getRight();
break;
}
}
});
}
});
float sampleValue=新浮点[1];
dataToCheck.keySet().stream().forEach(字段->{
List inputValues=inputData.get(字段);
List checkValues=dataToCheck.get(字段);
if(checkValues!=null&&inputValues!=null){
checkValues.stream().forEach(值->{
for(字符串输入:输入值){
if(value.getLeft().equalsIgnoreCase(inp)){
sampleValue[0]=value.getRight();
打破
}
}
});
}
});
一种稍微干净一点的执行方式是:
private static Float findFirstMatchingRight(MultivaluedMap<String, Pair<String, Float>> dataToCheck,
MultivaluedMap<String, String> inputData) {
for (Map.Entry<String, List<Pair<String, Float>>> entry : dataToCheck.entrySet()) {
Optional<Float> sampleValue = entry.getValue().stream()
.filter(cv -> inputData.get(entry.getKey())
.stream()
.anyMatch(inp -> cv.getLeft().equalsIgnoreCase(inp)))
.findFirst()
.map(Pair::getRight);
if (sampleValue.isPresent()) {
return sampleValue.get();
}
}
return Float.NaN; // when the condition doesn't match anywhere in the maps
}
private static Float findFirstMatchingRight(多值Map dataToCheck,
多值映射(输入数据){
对于(Map.Entry:dataToCheck.entrySet()){
可选的sampleValue=entry.getValue().stream()
.filter(cv->inputData.get(entry.getKey())
.stream()
.anyMatch(inp->cv.getLeft().equalsIgnoreCase(inp)))
.findFirst()
.map(对::getRight);
if(sampleValue.isPresent()){
返回sampleValue.get();
}
}
返回Float.NaN;//当条件与映射中的任何位置不匹配时
}
从何处来多值映射
?如果我必须有另一个条件来指定如果findFirst()不返回任何值,我想检查默认值(比如,其他
),我如何实现它?我想添加inp->cv.getLeft().equalsIgnoreCase(inp)| | cv.getLeft().equalsIgnoreCase(“其他”)
,但如果它首先看到other
,就会返回。但我希望在检查此默认值之前,仅在检查所有值之后返回它。这类似于开关的默认情况。@user2761431执行检查的顺序是否真的重要?如果是这样,那么您正在寻找另一个管道来执行类似的anyMatch
操作。否则,使用|
操作符附加条件也没有坏处,毕竟它是基于OR条件逻辑的短路操作。