gpt4 book ai didi

java - 如何使用 java 8 流用键的长度替换映射中的空值

转载 作者:行者123 更新时间:2023-12-01 12:55:34 26 4
gpt4 key购买 nike

我有一个 Map<String, Integer> ,它有一些键和值。我想将所有键与值关联为键的长度。我已经能够在纯 java 和 java-8 中解决这个问题,但不知何故我不认为在末尾附加终端操作,如 .collect(Collectors.toList());这在我的代码中不是必需的。

我的代码:( Java ) 工作正常

 Map<String, Integer> nameLength = new HashMap<>();
nameLength.put("John", null);
nameLength.put("Antony", 6);
nameLength.put("Yassir", 6);
nameLength.put("Karein", 6);
nameLength.put("Smith", null);
nameLength.put("JackeyLent",null);
for(Entry<String, Integer> length: nameLength.entrySet()){
if(length.getValue() == null){
nameLength.put(length.getKey(),length.getKey().length());
}
}

Java-8 也可以正常工作,但终端操作没用,我如何在不使用 .foreach() 的情况下避免它? .

nameLength.entrySet().stream().map(s->{
if(s.getValue() == null){
nameLength.put(s.getKey(),s.getKey().length());
}
return nameLength;
}).collect(Collectors.toList());
System.out.println(nameLength);

我可以在 Java-8 及更高版本中执行上述逻辑的任何其他方式??

最佳答案

如果您打算使用流,那么您应该避免副作用。函数式编程是关于纯操作的,其中输出仅取决于输入,函数没有副作用。换句话说,创建一个新 map 而不是修改现有 map 。

如果这样做,您还不如扔掉部分填写的 map 并从头开始重新计算所有内容。调用 String.length() 的成本很低,而且不值得费心去弄清楚哪些值是 null 哪些不是。 重新计算所有长度。

Map<String, Integer> newMap = nameLength.keySet().stream()
.collect(Collectors.toMap(
name -> name,
name -> name.length()
));

另一方面,如果您只是想修补当前的 map 流,那实际上并没有给您带来任何好处。我只是就地修改它而不涉及流。

for (Map.Entry<String, Integer> entry: nameLength.entrySet()) {
if (entry.getValue() == null) {
entry.setValue(entry.getKey().length());
}
}

或者,如上所述,您可以通过替换所有长度来简化问题:

nameLength.replaceAll((name, __) -> name.length());

(__ 表示未使用的变量,因此 doesn't get a meaningful name 。)

关于java - 如何使用 java 8 流用键的长度替换映射中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61388462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com