Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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_Android_Dictionary_Retrofit2 - Fatal编程技术网

java-如何从映射中删除所有空元素?

java-如何从映射中删除所有空元素?,java,android,dictionary,retrofit2,Java,Android,Dictionary,Retrofit2,问题的最简单形式是我有一个集合,我想删除/删除其值==null的所有元素。我不想就地删除(我想得到新地图,这样我的原始地图就安全了) publicmap附加_QUERY=newhashmap(); this.ADDITIONAL_QUERY.put(“deviceManufacturer”,payload.getManufacturer()); this.ADDITIONAL_QUERY.put(“deviceModel”,payload.getModel()); this.ADDITIONAL

问题的最简单形式是我有一个集合,我想删除/删除其
值==null
的所有元素。我不想就地删除(我想得到新地图,这样我的原始地图就安全了)

publicmap附加_QUERY=newhashmap();
this.ADDITIONAL_QUERY.put(“deviceManufacturer”,payload.getManufacturer());
this.ADDITIONAL_QUERY.put(“deviceModel”,payload.getModel());
this.ADDITIONAL_QUERY.put(“source”,payload.getSource());
this.ADDITIONAL_QUERY.put(“adrIMEI”,payload.getIMEI());
this.ADDITIONAL_QUERY.put(“adrMEID”,payload.getMEID());
this.ADDITIONAL_QUERY.put(“adrUDID”,payload.getUuid()==null?null:payload.getUuid().toString());
this.ADDITIONAL_QUERY.put(“adrID”,payload.getAndroid());
this.ADDITIONAL_QUERY.put(“adrSERIAL”,payload.getSerial());
我将更多元素添加到额外的查询中,这取决于我稍后调用的API

更多细节 我刚刚将我的改装库升级到2.0版。我的大多数API中都有
@FieldMap additionalQuery
(大约100个API)。根据他们的doc Relay
FieldMap
,“表单编码请求的命名键/值对。映射的空值、作为键或作为值是不允许的。”,正如java doc中提到的(很有趣,他们在web上的doc说您可以)

由于API被频繁调用,我正在寻找一种开销小、速度快的方法。

您可以使用:

map.values().removeAll(Collections.singleton(null));
您可以使用:

map.values().removeAll(Collections.singleton(null));

如果您有Guava,可以创建过滤视图以避免复制到新地图:

Map<String, String> filtered = Maps.filterValues(ADDITIONAL_QUERY, new Predicate<String>() {
    @Override
    public boolean apply(String value) {
        return value != null;
    }
});
Map filtered=Maps.filterValues(附加的查询,新的谓词(){
@凌驾
公共布尔应用(字符串值){
返回值!=null;
}
});
由于您使用的是Java 8,因此可以将谓词缩短如下:

Map<String, String> filtered = Maps.filterValues(ADDITIONAL_QUERY, Objects::nonNull);
Map filtered=Maps.filterValues(附加查询,Objects::nonNull);

如果您有番石榴,您可以创建一个过滤视图,以避免复制到新地图:

Map<String, String> filtered = Maps.filterValues(ADDITIONAL_QUERY, new Predicate<String>() {
    @Override
    public boolean apply(String value) {
        return value != null;
    }
});
Map filtered=Maps.filterValues(附加的查询,新的谓词(){
@凌驾
公共布尔应用(字符串值){
返回值!=null;
}
});
由于您使用的是Java 8,因此可以将谓词缩短如下:

Map<String, String> filtered = Maps.filterValues(ADDITIONAL_QUERY, Objects::nonNull);
Map filtered=Maps.filterValues(附加查询,Objects::nonNull);
您可以使用以下功能:

Map newMap = (HashMap) ADDITIONAL_QUERY.clone();;

newMap.values().remove(null);
您可以使用以下选项:

Map newMap = (HashMap) ADDITIONAL_QUERY.clone();;

newMap.values().remove(null);

一种可能的解决方案如下:

public <K, V> Map<K,V> removeNulls(Map<K,V> original) {
  return original.entrySet().stream().filter(e -> e.getValue() != null)
                 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
}
publicmap removeNulls(原始地图){
返回原始的.entrySet().stream().filter(e->e.getValue()!=null)
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue());
}

如果映射是巨大的,那么您甚至可以使用
parallelStream()
而不是
stream()
一个可能的解决方案如下:

public <K, V> Map<K,V> removeNulls(Map<K,V> original) {
  return original.entrySet().stream().filter(e -> e.getValue() != null)
                 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
}
publicmap removeNulls(原始地图){
返回原始的.entrySet().stream().filter(e->e.getValue()!=null)
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue());
}
如果映射很大,那么您甚至可以使用
parallelStream()
而不是
stream()

这应该可以:

map.values().removeIf(Objects::isNull);
这应该起作用:

map.values().removeIf(Objects::isNull);


迭代条目集并添加到新映射?我遗漏了什么吗?迭代条目集并添加到新映射?我遗漏了什么吗?OP明确地说他不想在适当的地方删除它们。@shmosel然后复制地图first@njzk2,为什么复制整个映射只是为了删除空值,特别是当OP试图避免开销时?OP明确表示他不想删除它们。@shmosel然后只复制映射first@njzk2,为什么复制整个映射只是为了删除空值,特别是当OP试图避免开销时?在Java 8中,lambda在这里也适用(
value->value!=null
)。@bcsb1001或
Objects::nonNull
。但这是一个Android问题,所以Lambda被淘汰了。Lambda占用了更多的内存空间,我不得不避免它。@Hesam他们没有比匿名类占用更多的空间。据我所知,它们在内存中是等价的。奇怪的是,一个lambda需要200字节,但是添加了一个大型库,比如Guava。在Java 8中,lambda也适用于这里(
value->value!=null
)。@bcsb1001或
Objects::nonNull
)。但这是一个Android问题,所以Lambda被淘汰了。Lambda占用了更多的内存空间,我不得不避免它。@Hesam他们没有比匿名类占用更多的空间。据我所知,它们在内存中是等价的。奇怪的是,一个lambda需要200字节,但却添加了一个大型库,如Guava。你只是复制了引用,而不是映射。@shmosel更正了你只是复制了引用,而不是映射。@shmosel更正了你也可以使用
对象::nonNull
Entry::getKey
Entry::getValue
。您也可以使用
Objects::nonNull
Entry::getKey
Entry::getValue