如何让这些简单又漂亮?
How to make these simple and beautiful?
当我把一个(KEY, VALUE)
放到一个映射中,比如Map<String, List<String>>
,我想先检查KEY是否存在,以决定是否要创建一个新的List,通常是我的Java 代码如下所示:
Map<String, List<String>> example = new HashMap<>();
public void put(String k, String v){
if(example.containsKey(k)){
example.get(k).add(v);
return;
}
List<String> vs = new ArrayList<>();
vs.add(v);
example.put(k,vs);
}
看起来不太好看。有没有什么办法可以让它更简单更漂亮?
如果你有 Java 8 你可以把它写成一行:
example.computeIfAbsent(k, key -> new ArrayList<>()).add(v);
这使用了 lambda,因此 new ArrayList
仅 在需要时创建。
(k
和 key
需要有不同的名称,因为它们是不同的变量)
Map<String, List<String>> example = new HashMap<>();
public void put(String k, String v){
if (!example.containsKey(k)){
example.put(k, new ArrayList<>();
}
example.get(k).add(v);
}
可以说,这有点浪费 - 要求您获取刚刚放置的列表 - 但在我看来,它更清晰,更具表现力。
如果您不能使用其他库,或者 java 8,您可以将整个地图包装起来并构建在您自己的 class 中。
你自己 class 你:
把混乱限制在一个地方。
隐藏您在幕后使用地图的面孔。
有地方可以移动任何额外的逻辑。
当我把一个(KEY, VALUE)
放到一个映射中,比如Map<String, List<String>>
,我想先检查KEY是否存在,以决定是否要创建一个新的List,通常是我的Java 代码如下所示:
Map<String, List<String>> example = new HashMap<>();
public void put(String k, String v){
if(example.containsKey(k)){
example.get(k).add(v);
return;
}
List<String> vs = new ArrayList<>();
vs.add(v);
example.put(k,vs);
}
看起来不太好看。有没有什么办法可以让它更简单更漂亮?
如果你有 Java 8 你可以把它写成一行:
example.computeIfAbsent(k, key -> new ArrayList<>()).add(v);
这使用了 lambda,因此 new ArrayList
仅 在需要时创建。
(k
和 key
需要有不同的名称,因为它们是不同的变量)
Map<String, List<String>> example = new HashMap<>();
public void put(String k, String v){
if (!example.containsKey(k)){
example.put(k, new ArrayList<>();
}
example.get(k).add(v);
}
可以说,这有点浪费 - 要求您获取刚刚放置的列表 - 但在我看来,它更清晰,更具表现力。
如果您不能使用其他库,或者 java 8,您可以将整个地图包装起来并构建在您自己的 class 中。
你自己 class 你:
把混乱限制在一个地方。
隐藏您在幕后使用地图的面孔。
有地方可以移动任何额外的逻辑。