首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,有没有一种干净的(并且是空的安全的)方法来乘以map的值?

在Java中,有没有一种干净的(并且是空的安全的)方法来乘以map的值?
EN

Stack Overflow用户
提问于 2018-10-17 16:08:00
回答 8查看 6.7K关注 0票数 48

我有一个Map<String, Double>,并希望将映射中的所有值乘以2,但将空值保留为空值。

我显然可以使用for循环来做这件事,但我想知道是否有更干净的方法来做这件事?

代码语言:javascript
复制
Map<String, Double> someMap = someMapFunction();
Map<String, Double> adjustedMap = new Hashmap<>();
if (someMap != null) {
    for (Map.Entry<String,Double> pair : someMap.entryset()) {
        if (pair.getValue() == null) {
            adjustedMap.put(pair.getKey(), pair.getValue());
        } else {
            adjustedMap.put(pair.getKey(), pair.getValue()*2)
        }

    }
}

此外,有时someMapFunction返回的映射是不可变的映射,因此无法使用Map.replaceAll就地完成此操作。我想不出一个更干净的流解决方案。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-10-17 16:16:02

我的第一个直觉是建议输入MapentrySetStream,它将值映射到新值,并以collectors.toMap()结束。

不幸的是,当值映射器函数返回null时,Collectors.toMap抛出NullPointerException。因此,它不适用于输入Mapnull值。

作为另一种选择,由于您不能改变输入Map,因此我建议您创建它的副本,然后调用replaceAll

代码语言:javascript
复制
Map<String, Double> adjustedMap = new HashMap<>(someMap);
adjustedMap.replaceAll ((k,v) -> v != null ? 2*v : null);
票数 63
EN

Stack Overflow用户

发布于 2018-10-17 16:38:09

作为流式传输和/或复制解决方案的替代方案,Google Guava中存在Maps.transformValues()实用程序方法

代码语言:javascript
复制
Map<String, Double> adjustedMap = Maps.transformValues(someMap, value -> (value != null) ? (2 * value) : null);

这将返回原始map的惰性视图,该视图本身不做任何工作,但在需要时应用给定的函数。这可以是一个优势(如果你不太可能需要所有的值,这将为你节省一些计算时间)和一个劣势(如果你需要多次相同的值,或者如果你需要在adjustedMap看不到变化的情况下进一步更改someMap ),这取决于你的使用情况。

票数 25
EN

Stack Overflow用户

发布于 2018-10-17 16:21:09

可以这样做。

代码语言:javascript
复制
someMap.entrySet().stream()
            .filter(stringDoubleEntry -> stringDoubleEntry.getValue() != null) //filter null values out
            .forEach(stringDoubleEntry -> stringDoubleEntry.setValue(stringDoubleEntry.getValue() * 2)); //multiply values which are not null

如果您需要第二个映射,其中的值不为空,只需使用forEach将它们放入新映射中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52850108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档