【问题标题】:Changing foreach into lambda expression将 foreach 更改为 lambda 表达式
【发布时间】:2017-11-03 14:52:43
【问题描述】:

我想将 foreach 更改为 lambda 表达式。我说的对吗?

Map<String, String> countriesToChooseAsMainCountry = new LinkedHashMap<String, String>();

Foreach:

for (Country country : project.getCountries()) {
   countriesToChooseAsMainCountry.put(Long.toString(country.getId()), country.getName());
}

拉姆达:

project.getCountries()
       .forEach(country -> countriesToChooseAsMainCountry.put(Long.toString(country.getId()), country.getName()));

如果我做对了,我能以某种方式提高它的可读性吗?谢谢。

【问题讨论】:

  • 您的两个“Foreach”与“Lambda”示例完全相同。你只是在用东西填充地图。
  • 你能编辑这个问题,让它有意义吗?就像@Mena 说的,Foreach 和 Lambda 代码是一样的。
  • @Mena 对不起,我的错,复制了同样的东西,更正了。
  • 编辑:是的,你的成语是等价的。
  • @cerbin 使用命令式 pre-lambda 习语可能更安全,但我怀疑您也可以使用 lambda 或 nullpointer 的答案。

标签: java lambda foreach java-8


【解决方案1】:

您可以将Collectors.toMap 用作:

project.getCountries()
       .stream()
       .collect(Collectors.toMap(country -> Long.toString(country.getId()), // key
                                 Country::getName, //value 
                                 (a, b) -> b, // function to determine the value in case of same country ids (which is essentially overriding the value) 
                                 LinkedHashMap::new));

它可以防止您出现 forEach 的不确定行为,尽管您当前的实现(要求)似乎很好。

【讨论】:

  • 这是一个不错的选择,但解释很少,也没有直接回答 OP 的问题。
  • 嗨@nullpointer。赞成,但我认为你至少应该解释为什么在(a, b) -&gt; b 中你返回b 而不是a。至少有一句关于merge函数的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多