地图的键可能是值1-5,其中不需要每个键,但是如果不存在,则必须连接类似于“-[]”的内容。
我之前已经使用过Java 8,我觉得可以使用stream()和collect()来更高效地完成此工作,但是我觉得外部列表的要求让我失望了。下面的代码有效,但感觉不正确。
List<String> ids = Arrays.asList("1", "2", "3", "4", "5");
StringBuilder location = new StringBuilder();
ids.forEach(id -> {
List<String> addresses = map.get(id);
if (addresses != null) {
addresses.forEach(addr -> location.append(addr + " - "));
} else {
location.append(" [] - ");
}
});
为科罗拉多州的位置生成如下所示的内容:
US - CO - [] - CENTENNIAL -
在回答尼古拉斯K时,地图的一个例子是
{1=[US], 2=[CO], 5=[METROPOLITAN FOOTBALL STADIUM DISTRICT, REGIONAL TRANSPORTATION DISTRICT]}
并有望收到输出
US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT
答案 0 :(得分:3)
处理映射中缺失值的正确方法是computeIfAbsent()
,这是自Java 8起在var headerFooterHeight = 200;
window.setInterval( function(){
document.getElementById("words").style.height = (window.innerHeight - headerFooterHeight)+"px";
console.log(document.getElementById("words").style.height);
}, 100);
上推出的新方法。
这将为您提供以下代码:
Map
String s = ids.stream()
.map(id -> map.computeIfAbsent(id, absentKey -> singletonList("[]")))
.flatMap(Collection::stream)
.collect(Collectors.joining(" - "));
列表变量中的地图中的键。ids
),否则"[]"
返回实际值。computeIfAbsent()
分隔的所有值,因此我们只需对列表流进行平面映射,并通过" - "
将它们加入。 " - "
现在保存值(如果与示例地图一起使用):
s
请注意,没有结尾的"US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT"
。 " - "
确保不要在元素之前或之后附加定界符。
答案 1 :(得分:1)
我正在使用Stream
和Optional
处理null
引用:
List<String> result = ids.stream()
.map(index -> format(map.get(index)))
.collect(Collectors.toList());
System.out.println(result);
方法format
:
private static String format(List<String> address) {
return Optional.ofNullable(address)
.map(a -> a.stream().map(part -> Optional.ofNullable(part).orElse("[]")).collect(Collectors.joining(" - ")))
.orElse(" [] - ");
}
应用于示例:
public static void main(String[] args) {
Map<String, List<String>> map = Map.of("1", Arrays.asList("US", "CO", null, "CENTENNIAL"));
List<String> ids = Arrays.asList("1", "2", "3", "4", "5");
List<String> result = ids.stream()
.map(index -> format(map.get(index)))
.collect(Collectors.toList());
System.out.println(result);
}
打印:
[US - CO - [] - CENTENNIAL, [] - , [] - , [] - , [] - ]
答案 2 :(得分:1)
更简单的方法:
ids.stream().map(l -> map.get(Integer.parseInt(l))).forEach(i -> {
if (i != null) {
location.append(i + " - ");
} else {
location.append("[] - ");
}
});
在这里,我们遍历列表中的每个元素以查看其是否在地图中作为键出现。根据值,我们附加适当的 strings 。
注意:
假设您的地图定义为Map<Integer, String>
答案 3 :(得分:1)
也许不是很干净,但是您可以尝试:
Map<String, List<String>> inputMap = Map.of("1", List.of(), "2", List.of("l1", "l2"));
List<String> ids = List.of("1", "2", "3", "4", "5");
StringBuilder location = new StringBuilder();
ids.forEach(id -> {
if (inputMap.get(id) != null) {
location.append(inputMap.get(id).stream().map(addr -> addr + " - ").collect(Collectors.joining()));
} else {
location.append(" [] - ");
}
});