在Java 8中添加了带有Supplier
的方法Objects.requireNonNull,但是我不确定声明的性能改进是什么:
尽管在非空情况下这可能会带来性能优势,但在决定调用此方法时,应注意创建消息供应商的成本要低于成本直接创建字符串消息的过程。
带有String的方法如果不为null则忽略参数:
public static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
我发现了JDK-8011800 : Add java.util.Objects.requireNonNull(T, Supplier)
在JDK 7中,java.util.Objects包含几种检查null的方法,其中包括一种方法,该方法接受一条消息以返回是否找到null。对于JDK 8中的lambda,要包括的另一个变体是requireNonNull方法,该方法采用字符串提供程序而不是字符串。因此,对于非null情况,可以避免为什么创建字符串消息的成本。请注意,lambda捕获的费用可能非零。
带有注释表示不影响性能:
非零捕获成本确实让我担心。 我担心它会经常消除使用供应商的任何优势。 2013/09/04
我发现了其他问题,但没有提到(为什么)发送String参数会降低性能
它专用于lambda表达式/流的使用吗?
答案 0 :(得分:4)
考虑一下,generateString
做很多事情以便从someParam
生成字符串:
Objects.requireNonNull(obj, generateString(someParam));
使用Java急切地评估参数,这意味着generateString
将在调用requireNonNull
之前进行评估。因此,无论obj
是否为空,都将对其进行计算。
您可以通过将其更改为以下内容来解决此问题:
Objects.requireNonNull(obj, () -> generateString(someParam));
在这种情况下,仅当generateString
实际上为空时,才会调用obj
。当generateString
比创建Supplier
对象昂贵时,这种方法更为有效。
如果您的String参数只是一个文字,则应该只使用普通的非lambda方法,例如:
Objects.requireNonNull(obj, "obj was null!");