gpt4 book ai didi

java - 方法引用没有被延迟评估?

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

<分区>

我的印象是下面的 lambda 表达式

() -> object.method()

相当于方法引用

object::method

IntelliJ 使情况更加复杂,它一直唠叨我用后者替换前者。

然而,我偶然发现了一个似乎并非如此的案例。我有一些代码需要访问各种 bean 的许多属性,这些属性可能为 null,也可能不为 null。因为我不想写一大堆

T1 var1 = bean1==null?null:bean1.getPropertyA()
T2 var2 = bean2==null?null:bean2.getPropertyB()
T3 var3 = bean3==null?null:bean3.getPropertyC()

行,我自作聪明写了如下方法:

private <T> T nullSafeGet(final Object object, Supplier<T> call) {
return object != null ? call.get() : null;
}

我现在可以编写以下内容:

T1 var1 = nullSafeGet(bean1, () -> bean1.getPropertyA());
T2 var1 = nullSafeGet(bean2, () -> bean2.getPropertyB());
T3 var1 = nullSafeGet(bean3, () -> bean3.getPropertyC());

这非常有效,如果 bean 为 null,则不会调用 getter 并将变量设置为 null

但是,我想让上面的 block 更具可读性(IntelliJ 也建议我这样做),所以我将其更改为:

T1 var1 = nullSafeGet(bean1, bean1::getPropertyA);
T2 var1 = nullSafeGet(bean2, bean2::getPropertyB);
T3 var1 = nullSafeGet(bean3, bean3::getPropertyC);

当 bean 为非空时,其行为完全相同。但是,如果这些 bean 中的任何一个为 null,则对 nullSafeGet 的调用将抛出一个 NullPointerException

据我所知,方法引用 bean::getProperty 不会被惰性求值(即仅当调用 nullSafeGet() 中的供应商时),​​而 lambda 表达式仅在需要时求值.

我是不是做错了什么,或者这两个符号在所有方面确实不相等?

下面的代码演示了这个问题:

import org.junit.Test;

import java.util.function.Supplier;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class PersonTest {
private static final String NAME = "Fester Bettertester";

@Test
public void testAccessNonNullReference() {
Person person = new Person(NAME);

assertEquals(NAME, nullSafeGet(person, person::getName));
}

@Test
public void testAccessNonNullLambda() {
Person person = new Person(NAME);

assertEquals(NAME, nullSafeGet(person, () -> person.getName()));
}

@Test
public void testAccessNullLambda() {
Person person = null;

assertNull(nullSafeGet(person, () -> person.getName()));
}

@Test
public void testAccessNullReference() {
Person person = null;

assertNull(nullSafeGet(person, person::getName)); // this throws a null pointer exception
}

private <T> T nullSafeGet(final Object object, Supplier<T> call) {
return object != null ? call.get() : null;
}

public class Person {
private final String name;

Person(final String name) {
this.name = name;
}

String getName() {
return name;
}
}
}

编辑:很抱歉提出重复的问题,我尝试搜索以前的答案,但显然使用了错误的搜索词。

我只是在编辑问题以添加 Seelenvirtuose 提供的解决方案解决了我的问题!

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