Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配两个多值映射并检索值_Java_Dictionary_Java 8_Java Stream - Fatal编程技术网

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条件逻辑的短路操作。