gpt4 book ai didi

java - 如何从 Java 8 中的 lambda 表达式中获取信息?

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:39 25 4
gpt4 key购买 nike

我明白为什么 lambda 表达式不能改变局部变量,我明白它们可以访问和改变类字段。对我来说,lambda 在很多情况下都能创建更具表现力的代码,我想更频繁地使用它们。

我的问题是,使用 lambda 的最佳实践是什么,而不是将其用作单一方法对象替换,而是简化如下代码:

int pairsFound = 0;
for (Map.Entry<String, Integer> entry : counters.entrySet())
{
if (entry.getValue() == 2)
pairsFound++;
}

pairsFound = map.forEach((key, value) ->
{
int z = 0;
if (value == 2)
z++;
return z;
});

map.forEach((key, value) ->
{
if (value == 2)
pairsFound++;
});

一个解决方案是使 parisFound 成为一个实例字段。但是,在我看来,从未在单一方法之外使用过的变量的静态化似乎是一种代码味道。此外,如果封闭类是静态的(例如在测试运行中),这将不起作用。

是否有其他方法可以安全地从 lambda 中获取信息,而不是使用 for each 循环?我知道 lambda 可能存在并发问题,但在我的大多数简化用例中,我不知道 lambda 是否会比它所替代的更不安全。

最佳答案

这个场景最简单的方法是创建一个流,以entry.getValue() == 2为条件进行过滤,然后count()得到结果.像这样:

long pairsFound = map.values().stream().filter(v -> v == 2).count(); //using values() rather than entrySet() makes the code more readable

一般的教训是,使用 lambda 需要一种不同的思维方式,一种更接近函数式编程(lambda 概念的起源)的思维方式,而不是试图将相同的命令式原则强加于它。从 lambda 中获取信息的正确方法是评估它们,而不是通过副作用。

关于java - 如何从 Java 8 中的 lambda 表达式中获取信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34749325/

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