改进用于放置/检索项目的Java映射的优雅性

改进用于放置/检索项目的Java映射的优雅性,java,Java,我有一个简单的片段: String partition = getPath(data); if (partitioningMap.containsKey(partition)) { partitioningMap.get(partition).add(data); } else { partitioningMap.put(partition, new Array

我有一个简单的片段:

            String partition = getPath(data);
            if (partitioningMap.containsKey(partition)) {
                partitioningMap.get(partition).add(data);
            } else {
                partitioningMap.put(partition, new ArrayList<>(Arrays.asList(record)));
            }
String partition=getPath(数据);
if(分区地图.容器(分区)){
获取(分区)、添加(数据);
}否则{
partitioningMap.put(partition,newarrayList(Arrays.asList(record));
}
我意识到这已经很简单了,但出于好奇,我想知道是否有一种更简洁的方法可以在不使用if-else块的情况下执行这些操作


我正在研究类似于
putIfAbsent
的内容,但我正在通过该键上的
add
修改列表。我在考虑
computeIfAbsent
,但是
computeIfAbsent
computeiFabPresent
仍然是两个不同的调用。

有几种方法可以做到这一点:

java 8之前的版本:

String partition = getPath(data);
if (!partitioningMap.containsKey(partition)) {
  partitioningMap.put(partition, new ArrayList<>());
}
partitioningMap.get(partition).add(data);
String partition=getPath(数据);
如果(!partitioningMap.containsKey(分区)){
put(partition,new ArrayList());
}
获取(分区)、添加(数据);
在java 8中,您可以执行以下操作:

partitioningMap.computeIfAbsent(getPath(data), d -> new ArrayList<>()).add(data);
partitioningMap.computeIfAbsent(getPath(data),d->newArrayList()).add(data);

有几种方法可以做到这一点:

java 8之前的版本:

String partition = getPath(data);
if (!partitioningMap.containsKey(partition)) {
  partitioningMap.put(partition, new ArrayList<>());
}
partitioningMap.get(partition).add(data);
String partition=getPath(数据);
如果(!partitioningMap.containsKey(分区)){
put(partition,new ArrayList());
}
获取(分区)、添加(数据);
在java 8中,您可以执行以下操作:

partitioningMap.computeIfAbsent(getPath(data), d -> new ArrayList<>()).add(data);
partitioningMap.computeIfAbsent(getPath(data),d->newArrayList()).add(data);


map.computeIfAbsent(key,k->new HashSet()).add(v)中直接列出了一个备选方案:我认为
分区映射.get(partition).add(data)必须是
partitioningMap.get(partition).add(record)
如果您可以使用外部库,Guava有一个非常适合此用例的优秀实现。
数据
记录
是否不同?一个备选方案直接列在:
map.computeIfAbsent(key,k->new HashSet()).add(v)我认为
分区映射.get(partition).add(data)必须是
partitioningMap.get(partition).add(record)
如果您可以使用外部库,Guava有一个非常适合此用例的优秀实现。
数据
记录
是否不同?OP的代码在
分区
作为键存在时添加
数据
,在没有分区时添加
记录。@saka1029对;我的第一个例子只是OP已经拥有的一个更干净的版本。只需要检查密钥是否存在,如果不存在,则设置它。如果没有其他需要,有没有一种方法可以在没有代码的情况下从该计算返回哈希映射?尝试Map result=records.stream().Map(record->partitioningMap.computeIfAbsent(getPath(record),d->newArrayList()).add(record)).collect(Collectors.toMap());可能会增加不必要的复杂性,但实际上并不需要。简单化有时是最好的方法,即使它需要几行代码。只是好奇,但是agreedOP的代码在
分区作为键存在时添加
数据
,在不作为键存在时添加
记录。@saka129 right;我的第一个例子只是OP已经拥有的一个更干净的版本。只需要检查密钥是否存在,如果不存在,则设置它。如果没有其他需要,有没有一种方法可以在没有代码的情况下从该计算返回哈希映射?尝试Map result=records.stream().Map(record->partitioningMap.computeIfAbsent(getPath(record),d->newArrayList()).add(record)).collect(Collectors.toMap());可能会增加不必要的复杂性,但实际上并不需要。简单化有时是最好的方法,即使它需要几行代码