在java中检查非空值的最佳方法是什么.
String query ="abcd";
Run Code Online (Sandbox Code Playgroud)
query != null
VS !query.equals(null).
哪个更好?为什么?
假设我有一个对象Response.现在我想检查一个布尔变量,成功,在Response下并做一个早期返回是响应不成功.
if(response == null || !response.success){
return;
} //Java version
Run Code Online (Sandbox Code Playgroud)
现在我想使用Kotlin的null安全检查,如下所示
if(response?.success ?: true){
return
}
Run Code Online (Sandbox Code Playgroud)
如果我没有错,如果响应或成功为null,我们将在if条件内返回true.但是,如果response.success不为null且等于true,我们仍将从函数返回,这不是我想要的.我该如何纠正这种情况?
我需要使用对象中 3 个级别的 getter。
response.getServiceError().getErrorCode()
Run Code Online (Sandbox Code Playgroud)
一个或多个对象可能为 NULL。现在,我正在这样做
if (response != null && response.getServiceError() != null && response.getServiceError().getErrorCode() != null && response.getServiceError().getErrorCode().equals("errCode123")) {
//doSomething;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好和/或优雅的方式来构建 if 条件?
首先我知道这两种方法的区别。
Optional.of
:用于保证不存在null,如果输入null,则nullPointException
Optional.ofNullable
: 可能为空,也可能不为空。用来灵活应对。
那么,如果我加上orElseThrow(() -> new NullPointerException("null data"))
这个,结果会是一样的吗?
我想抛出带有显式内容的错误。
所以我得到Optional.ofNullable(data).orElseThrow(() -> new NullPointerException("null data")))
将其用作这是无意义的行为吗?
Optional.of(data).orElseThrow(() -> new NullPointerException("null data")))
我认为这也是可能的,但我只是用来ofNullable()
使代码看起来一致。
总结一下,到底如果加上的话结果还是一样orElseThrow(nullPoint)
吗of
?ofNullable
那么反而of.orElseThrow
更好呢?
谁能告诉我在 c# 中检查对象或对象的属性是否为空的性能成本是多少?我正在开发一个 ASP.NET MVC 应用程序,该应用程序正在模型中完成空检查,然后在视图中再次完成。我觉得这太过分了,但如果没有真正的性能下降,那么我不认为这样做有什么害处。
我正在使用scripto在node.js中编写脚本,我正在尝试对数据库中的值进行nil检查:这里是js代码(用于节点) -
var redis = require("redis");
var redisClient = redis.createClient("6379","localhost");
var Scripto = require('redis-scripto');
var scriptManager = new Scripto(redisClient);
var scripts = {
'test':'local function test(i) '+
'if (i==nil) then return i end '+
'local ch = redis.call("get", i) '+
'if (ch==nil) then return ("ch is nil") '+
'else return "1" '+
'end end '+
'return (test(KEYS[1]))',
};
scriptManager.load(scripts);
scriptManager.run('test', ["someInvalidKey"], [], function(err,result){
console.log(err || result);
});
Run Code Online (Sandbox Code Playgroud)
但在if语句中我无法进入"ch is nil" ...任何帮助?
我想下面的方法调用链.
void DoSomething()
{
ObjectA a = CreateA();
if (a != null)
{
a.Foo();
}
}
ObjectA CreateA()
{
ObjectB b = CreateB();
if (b != null)
{
ObjectA a = b.ToA();
return a;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果方法调用深度变深,则空检查将更加重叠.对此有什么好的解决方案吗?
改性
我改变了示例代码.它无法解决我将CreateA更改为构造函数的问题.问题是只有不必要的空检查链接重叠.
void SetImage()
{
UISprite image = GetSprite();
if (image != null)
{
image.spriteName = "hat";
}
}
UISprite GetSprite()
{
UISprite image = GetComponent<UISprite>();
if (image != null)
{
image.width = 100;
image.height = 100;
return image;
}
return …
Run Code Online (Sandbox Code Playgroud) Java 8中添加了带有Objects.requireNonNull的方法Supplier
,但是我不确定声明的性能改进是什么:
尽管这在非null情况下可能会带来性能优势,但是在决定调用此方法时,应注意创建消息提供者的成本要比直接创建字符串消息的成本要低。
带String的方法如果不为null则忽略参数:
public static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
我发现了JDK-8011800:添加java.util.Objects.requireNonNull(T,Supplier)
在JDK 7中,java.util.Objects包括几种检查null的方法,其中包括一种方法,该方法接受一条消息以返回是否找到null。对于JDK 8中的lambda,要包括的另一个变体是requireNonNull方法,该方法采用字符串提供程序而不是字符串。因此,对于非null情况,可以避免创建字符串消息的成本。请注意,lambda捕获的费用可能会为非零。
有注释表示对性能没有影响:
非零捕获成本确实让我担心。我担心它会经常消除使用供应商的任何优势。 2013/09/04
我发现了其他问题,但没有提到(为什么)发送String参数会降低性能
它专用于lambda表达式/流用法吗?
我在 JVM 11 上使用 Kotlin 1.5.20 做了以下操作(AdoptOpenJDK build 11.0.4+11)
通常在 Kotlin 中,我会执行偏向x?.let {}
或x?.run {}
超过if(x != null) {}
. 我将这三种方法反编译为 Java,以了解我最喜欢的方法是否会引入任何类型的低效率。反编译这个 Kotlin 代码
class Main {
fun main1(x: String?){
x?.run { println(this) }
}
fun main2(x: String?){
x?.let { x1 -> println(x1) }
}
fun main3(x: String?){
if (x != null){
println(x)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到这个 Java 代码
@Metadata(
mv = {1, 5, 1},
k = 1,
d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0003\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u0010\u0010\u0003\u001a\u00020\u00042\b\u0010\u0005\u001a\u0004\u0018\u00010\u0006J\u0010\u0010\u0007\u001a\u00020\u00042\b\u0010\u0005\u001a\u0004\u0018\u00010\u0006J\u0010\u0010\b\u001a\u00020\u00042\b\u0010\u0005\u001a\u0004\u0018\u00010\u0006¨\u0006\t"},
d2 = {"Lcom/cgm/experiments/Main;", "", "()V", "main1", …
Run Code Online (Sandbox Code Playgroud) 嘿伙计们有没有更短的方法来写这一行。
int objectID = jsonObject != null && jsonObject.ObjectID.HasValue && jsonObject.ObjectID.Value > 0 ? jsonObject.ObjectID.Value : defaultObject.ObjectID;
//jsonObject.ObjectID is int?
Run Code Online (Sandbox Code Playgroud)
你可以使用空合并来检查空值和> 0吗?
null-check ×10
java ×5
null ×5
c# ×3
java-8 ×2
kotlin ×2
string ×2
asp.net-mvc ×1
java-11 ×1
lua ×1
node-redis ×1
nullable ×1
object ×1
option-type ×1
performance ×1
redis ×1