如何从Map中删除所有null元素?

时间:2016-06-06 18:25:17

标签: java android dictionary retrofit2

最简单的问题是我有一个集合,我想删除/删除value == null的所有元素。我不希望删除到位(我想获得新的地图,所以我的原始地图是安全的)。

public Map<String, String> ADDITIONAL_QUERY = new HashMap<>();
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.getAndroidId());
this.ADDITIONAL_QUERY.put("adrSERIAL", payload.getSerial());

我向ADDITIONAL_QUERY添加更多元素取决于我稍后调用的API。

更多详情

我刚刚将我的Retrofit lib升级到2.0版。我的大多数API(大约100个API)都有@FieldMap Map<String, String> additionalQuery个。根据他们的文档考虑FieldMap,“表单编码请求的命名键/值对。不允许地图的空值,作为键,或作为值。”,如java doc中所述(这很有趣,他们的网络文档说你可以https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/class-use/FieldMap.html)。

enter image description here

随着API被大量调用,我正在寻找一种方式,但开销很小,当然也很快。

5 个答案:

答案 0 :(得分:4)

您可以使用:

data.write.format('com.databricks.spark.csv').options(delimiter="\t", codec="org.apache.hadoop.io.compress.GzipCodec").save('s3a://myBucket/myPath')

答案 1 :(得分:0)

如果你有Guava,你可以创建一个过滤后的视图,以避免复制到新地图:

Map<String, String> filtered = Maps.filterValues(ADDITIONAL_QUERY, new Predicate<String>() {
    @Override
    public boolean apply(String value) {
        return value != null;
    }
});

由于您使用的是Java 8,因此可以缩短谓词:

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

答案 2 :(得分:0)

您可以使用:

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

newMap.values().remove(null);

答案 3 :(得分:0)

可能的解决方案如下:

SET @query = CAST('
declare @testStatus varchar(20);
IF (
    SELECT COUNT(*)
    FROM [' +@dbname+ '].dbo.Table1
    WHERE [' +@dbname+ '].dbo.Table1.Column1  = ''''
) = 0
    SET @testStatus = ''Test Passed''
ELSE
    SET @testStatus = ''Test Failed''

INSERT INTO [Database].dbo.Table2(FileName, Result, Date)
VALUES (''File1'', @testStatus, GETDATE())'
AS NVARCHAR(MAX))

如果地图很大,那么您甚至可以使用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())); } 代替parallelStream()

答案 4 :(得分:0)

这应该有效:

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