gpt4 book ai didi

java - Lambda 表达式功能困惑

转载 作者:行者123 更新时间:2023-11-30 07:50:13 24 4
gpt4 key购买 nike

我正在尝试学习 lambda 表达式。我目前指的是OCP学习指南。

在 lambda 表达式的一个示例中,有一个 Animal 类和另一个名为 CheckTrait 的接口(interface)。 lambda 表达式的功能让我很困惑。示例代码如下所示:

没有 lambda 表达式。

public interface CheckTrait {
public boolean test(Animal a);
}


public class Animal implements CheckTrait{

private String species;
private boolean canHop;
private boolean canSwim;

public Animal(String species, boolean canHop, boolean canSwim) {
super();
this.species = species;
this.canHop = canHop;
this.canSwim = canSwim;
}

public boolean canHop() {
return this.canHop;
}

public String toString() {
return species;
}

public boolean canSwim() {
return this.canSwim;
}

@Override
public boolean test(Animal a) {

return a.canHop();
}
}

public class FindMathcingAnimals {

private static void print(Animal animal, CheckTrait trait) {
if(trait.test(animal)){
System.out.println(animal+" can hop" );
}else {
System.out.println(animal+" cannot hop");
}

}

public static void main(String[] args) {

Animal animal2= new Animal("Kangaroo", true, false);
print(animal2,animal2);
}

}

当我们运行上面的类时,我们得到的输出是Kangaroo can hop

使用 lambda 表达式

public interface CheckTrait {
public boolean test(Animal a);
}


public class Animal {

private String species;
private boolean canHop;
private boolean canSwim;

public Animal(String species, boolean canHop, boolean canSwim) {
super();
this.species = species;
this.canHop = canHop;
this.canSwim = canSwim;
}

public boolean canHop() {
return this.canHop;
}

public String toString() {
return species;
}

public boolean canSwim() {
return this.canSwim;
}


}


public class FindMathcingAnimals {

private static void print(Animal animal, CheckTrait trait) {
if(trait.test(animal)){
System.out.println(animal+" can hop" );
}else {
System.out.println(animal+" cannot hop");
}

}

public static void main(String[] args) {

Animal animal2= new Animal("Kangaroo", true, false);
print(animal2,s->s.canHop());
}

}

我的问题是,在下面一行 print(animal2,s->s.canHop());

我没有将任何值传递给 s 而只​​是一个表达式,那么程序如何计算结果?我知道它只是凭直觉获取动物对象并检查 canhop 变量,但我不理解这里的逻辑。请提供您的想法。

编辑:根据 Aominè 的回答:

所以,我可以得出结论吗?在打印方法中,我传递了 CheckTrait 的行为,在打印方法中可以简化为:

第 1 步:if(trait.test(animal)){

第二步:if(s.canHop())

第三步:if(animal.canHop)

以上步骤仅供我理解。

最佳答案

I am not passing any value to s but just an expression, then how is the program computing the result?

下面你将一个行为(一个函数)作为第二个参数传递给打印方法,它将在打印方法中使用。

print(animal2, s -> s.canHop());

这个函数读作 “给定一个元素 say s,调用元素上的 canHop() 方法”

现在在 print 方法中当你这样做时:

if(trait.test(animal)){ ... }

您正在调用 trait.test(animal) 并将动物对象传递给我们传入的函数,然后我们将该函数应用于输入动物。

如果有帮助:

print(animal2,s -> s.canHop());

可以看作是相同的:

print(animal2, new CheckTrait() {
@Override
public boolean test(Animal s) {
return s.canHop();
}
});

编辑:

正如您所提到的,方法调用可以看作:

if(trait.test(animal)){..} -> if(s.canHop()){..} -> if(animal.canHop){..} // pseudocode

关于java - Lambda 表达式功能困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952508/

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