我有一张String - Array的 map ,看起来像这样

dishIdQuantityMap[43]=[Ljava.lang.String;@301d55ce
dishIdQuantityMap[42]=[Ljava.lang.String;@72cb31c2
dishIdQuantityMap[41]=[Ljava.lang.String;@1670799
dishIdQuantityMap[40]=[Ljava.lang.String;@a5b3d21

我需要做的是

  1. 创建一个新 map ,其中从字符串中提取仅包含关键字的数字,如下所示( key -> key.replaceAll("\\D+","");
  2. 值-数组中的第一个值,如value -> value[0];
  3. 过滤一个数组,这样只有这个巴黎剩下value > 0

我花了一个小时试着自己解这个问题,但是用.collect(Collectors.toMap());个方法都失败了.

更新: 我到目前为止所做的代码.我用过滤发不了 map .

HashMap<Long, Integer> myHashMap =  request.getParameterMap().entrySet().stream()
        .filter(e -> Integer.parseInt(e.getValue()[0]) > 0)
        .collect(Collectors.toMap(MapEntry::getKey, MapEntry::getValue));

推荐答案

您可以使用STREAM和辅助的KeyValuePair类来完成此操作. KeyValuePair将非常简单,如下所示:

public class KeyValuePair {

    public KeyValuePair(String key, int value) {
        this.key = key;
        this.value = value;
    }
    
    private String key;
    private int value;
    
    //getters and setters
}

有了这个类,您可以像下面这样使用STREAMS:

Map<String, Integer> resultMap = map.entrySet().stream()
            .map(entry -> new KeyValuePair(entry.getKey().replaceAll("Key", "k"), entry.getValue()[0]))
            .filter(kvp -> kvp.value > 0)
            .collect(Collectors.toMap(KeyValuePair::getKey, KeyValuePair::getValue));

在这个例子中,我并没有完全按照您需要的条件进行替换和过滤,但是,正如您所说,收集器存在问题,您可能只需要修改当前的代码.

Java相关问答推荐

验证使用GCP生成的非对称密钥时签名不起作用

在没有maven或IDE的情况下从命令行运行PFA模块化应用程序时出现神秘错误

如何跟踪我在数组中的位置

如何让HikariCP指标在NewRelic中正确显示?

JPackage-results已安装-如何添加系统属性?

BiPredicate和如何使用它

Java事件系统通用转换为有界通配符

为什么Java的代码工作(if condition内部的实例)

如何判断一个矩阵是否为有框矩阵?

当Volatile关键字真的是必要的时候?

如何使用带有谓词参数的方法,而不使用lambda表达式

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

何时调用密封层次 struct 的switch 中的默认情况

为什么相同的数据条码在视觉上看起来不同?

为什么Spring要更改Java版本配置以及如何正确设置?

spring 更新多项管理关系

如何使用stream.allMatch()为空流返回false?