使用 java8 方法引用的 Nullcheck 方法可能吗?
Nullcheck method using java8 method reference possible?
由于分析丰富,我们的 Java 代码中充斥着可为 null 对象的方法结果的输出。
看起来像这样
namedObject == null ? "?" : namedObject.getName()
是否可以为此编写一个静态方法? (例如看起来像这样):
Util.nvl( namedObject, NamedObject::getName, "?" )
= Util.nvl 会是什么样子?我尝试了一些搜索 google 但没有结果。
这不起作用:
public static <T> T nvl(T value, Function<T, ?> method, T nullSubstition) {
return value == null ? nullSubstition : (T) method.apply(value);
}
编译器告诉我:
无法从静态上下文中引用非静态方法 getName()
您的签名不正确。您希望您的方法将 NamedObject 作为第一个参数(因此 T 是一个 NamedObject),并 return 一个字符串(因此现在 T 是字符串)。
您需要两个泛型类型参数:
public class Utils {
public static <O, T> T nvl(O value, Function<O, T> method, T nullSubstition) {
return value == null ? nullSubstition : method.apply(value);
}
static class NamedObject {
String getName() {
return "foo";
}
}
public static void main(String[] args) {
NamedObject foo = null;
String name = Utils.nvl(foo, NamedObject::getName, "bar");
System.out.println("name = " + name); // name = bar
foo = new NamedObject();
name = Utils.nvl(foo, NamedObject::getName, "bar");
System.out.println("name = " + name); // name = foo
}
}
一个更好的签名,允许更大的灵活性,
public static <O, T> T nvl(O value, Function<? super O, ? extends T> method, T nullSubstition) {
return value == null ? nullSubstition : method.apply(value);
}
您方法的泛型定义不正确。您正在尝试创建一个方法来接收特定类型的对象(T
,为了参数的缘故,或在给定示例中的 NamedObject
),并应用一个方法 returns一个不同类型的对象(S
,为了参数的缘故,或者在给定的例子中是 String
),或者默认的 S
值,如果传递的对象是 null
:
public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) {
return value == null ? nullSubstition : (S) method.apply(value);
}
请注意,Java 8 的 Optional
可能会让您以更优雅的方式编写此代码(尽管优雅在旁观者眼中有点):
public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) {
return Optional.ofNullable(value).map(method).orElse(nullSubstition);
}
由于分析丰富,我们的 Java 代码中充斥着可为 null 对象的方法结果的输出。
看起来像这样
namedObject == null ? "?" : namedObject.getName()
是否可以为此编写一个静态方法? (例如看起来像这样):
Util.nvl( namedObject, NamedObject::getName, "?" )
= Util.nvl 会是什么样子?我尝试了一些搜索 google 但没有结果。
这不起作用:
public static <T> T nvl(T value, Function<T, ?> method, T nullSubstition) {
return value == null ? nullSubstition : (T) method.apply(value);
}
编译器告诉我: 无法从静态上下文中引用非静态方法 getName()
您的签名不正确。您希望您的方法将 NamedObject 作为第一个参数(因此 T 是一个 NamedObject),并 return 一个字符串(因此现在 T 是字符串)。
您需要两个泛型类型参数:
public class Utils {
public static <O, T> T nvl(O value, Function<O, T> method, T nullSubstition) {
return value == null ? nullSubstition : method.apply(value);
}
static class NamedObject {
String getName() {
return "foo";
}
}
public static void main(String[] args) {
NamedObject foo = null;
String name = Utils.nvl(foo, NamedObject::getName, "bar");
System.out.println("name = " + name); // name = bar
foo = new NamedObject();
name = Utils.nvl(foo, NamedObject::getName, "bar");
System.out.println("name = " + name); // name = foo
}
}
一个更好的签名,允许更大的灵活性,
public static <O, T> T nvl(O value, Function<? super O, ? extends T> method, T nullSubstition) {
return value == null ? nullSubstition : method.apply(value);
}
您方法的泛型定义不正确。您正在尝试创建一个方法来接收特定类型的对象(T
,为了参数的缘故,或在给定示例中的 NamedObject
),并应用一个方法 returns一个不同类型的对象(S
,为了参数的缘故,或者在给定的例子中是 String
),或者默认的 S
值,如果传递的对象是 null
:
public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) {
return value == null ? nullSubstition : (S) method.apply(value);
}
请注意,Java 8 的 Optional
可能会让您以更优雅的方式编写此代码(尽管优雅在旁观者眼中有点):
public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) {
return Optional.ofNullable(value).map(method).orElse(nullSubstition);
}