我想获得有关此代码的Java7此功能的详细信息
public String getPostcode(Person person)
{
if (person != null)
{
Address address = person.getAddress();
if (address != null)
{
return address.getPostcode();
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
可以做这样的事情
public String getPostcode(Person person)
{
return person?.getAddress()?.getPostcode();
}
Run Code Online (Sandbox Code Playgroud)
但坦率地说,对我来说不太清楚.请解释一下?
问题:是否有计划用于任何未来Java版本的Elvis运算符的实现?或者是否有任何库将其带入Java?
我读过这个
它是为Java SE 7提出的,但没有进入该版本
http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html
我知道Java 8允许这样做
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Run Code Online (Sandbox Code Playgroud)
但是我的口味太过分了.因此,如果有人能指出我将任何项目/库,将Groovy喜欢/ C#类似的语法带到Java的Null Checks,将不胜感激.
编辑:通过Elvis运算符我的意思是:
String version = computer?.getSoundcard()?.getUSB()?.getVersion();
Run Code Online (Sandbox Code Playgroud)
或类似的
我正在尝试在 android studio 中使用 Kotlin 构建地理围栏应用程序,但虚拟机崩溃了,然后下次运行显示此错误
E/AndroidRuntime:致命异常:主进程:com.example.mapgis,PID:3002 java.lang.NullPointerException:指定为非空的参数为空:方法 kotlin.jvm.internal.Intrinsics.checkNotNullParameter,在 com. example.mapgis.MapsActivity.onMapReady$lambda-2(未知来源:7)位于 com.example.mapgis.MapsActivity。$r8$lambda$j524CuJ2hJLTFNPmiaC5VRpPy0I(未知来源:0)位于 com.example.mapgis.MapsActivity$$ExternalSyntheticLambda2。 onSuccess(来源不明:4)在 com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.0:1)在 android.os.Handler。处理回调(Handler.java:873)在android.os.Handler.dispatchMessage(Handler.java:99)在android.os.Looper.loop(Looper.java:193)在android.app.ActivityThread.main(ActivityThread.java :6669)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)在com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)
代码
package com.example.mapgis
import android.Manifest
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.location.Location
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.app.JobIntentService
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.example.mapgis.GeofenceReceiver
import com.example.mapgis.R
import com.example.mapgis.Reminder
import com.google.android.gms.location.*
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.maps.*
import com.google.android.gms.maps.model.CircleOptions
import com.google.android.gms.maps.model.LatLng
import …Run Code Online (Sandbox Code Playgroud) android google-api kotlin android-geofence firebase-realtime-database
contains在Java集合上执行null-safe的最佳方法是什么?
换一种说法 -
if (collection != null && collection.contains(x))
Run Code Online (Sandbox Code Playgroud)
?
我希望Apache commons-collections有类似的东西CollectionUtils.contains(collection, x),如果集合为null,就会返回false,因为有size(),像空集合一样处理null.
然而,似乎没有这样的事情 - 我只是想念它吗?
我的代码如下:
obj1 = SomeObject.method1();
if (obj1 != null) {
obj2 = obj1.method2();
if (obj2 != null) {
obj3 = obj2.method3();
if (obj3 != null) {
............
return objN.methodM();
}
}
}
....
Run Code Online (Sandbox Code Playgroud)
我有近10步.它似乎非常脆弱且容易出错.有没有更好的方法来检查空链方法?
谢谢.
阅读后:
有效的Java(参见条款43) - Joshua Bloch
清洁代码(不要返回空) - Bob叔叔
避免!= null语句
Null对象模式
我正在寻找答案,当搜索最终成为非收集对象不存在的实体时,DAO应该返回什么.通过使用空数组或emptyList方法,集合对象确实可以.但是对于非收藏品,它可能会更难.另一种解决方案是永远不会返回null,而是使用Null Object模式.但是我不知道将Null Object模式与DAO集成,我真的很高兴看到与Null Object模式和DAO模式的完美集成,特别是对于模型(dto)对象返回情况.
我将非常感谢并欢迎任何最佳设计模式,场景和建议.
似乎广泛接受断言语句应保留用于测试和生产中禁用,因为错误应该已经解决,并且启用断言会影响性能.然而,使用if语句进行空检查肯定也是如此.为什么这段代码被认为适合生产
if(x != null) {
x.setId(idx);
if (y != null) {
if (y.id == x.id) {
x.doSth();
}
} else {
//handle error
}
} else {
//handle error
}
Run Code Online (Sandbox Code Playgroud)
但这段代码不是吗?(假设启用了断言)
try {
assert(x != null);
x.setId(idx);
assert(y != null);
if (y.id == x.id) {
x.doSth();
}
} catch (AssertionError e) {
//handle error
}
Run Code Online (Sandbox Code Playgroud)
我理解在预期变量可能未初始化时使用if语句.然而,当它用于防御性编码时,断言似乎更优雅和可读.
我还测试了每种方法的性能:
public class AssertTest {
static final int LOOPS = 10000000;
public static void main(String[] args) {
String testStr = "";
long startNotEqualsTest = …Run Code Online (Sandbox Code Playgroud) 这foo是由返回lookup可能null.
这就是为什么我试图避免调用foo.getFooStr()上null的第一返回值null是否foo为null.
但是有更好(更简洁)的方式来写这个吗?
public static String getFooStr(String input)
{
Foo foo = lookup(input);
if(foo==null)
{
return null;
}
return foo.getFooStr();
}
Run Code Online (Sandbox Code Playgroud) 我想用oracle jdk 1.8编译简单的代码:
class Foo {
public static void test(@NotNull String a) {}
}
Run Code Online (Sandbox Code Playgroud)
但是idea不了解这样的代码,建议添加:
import com.sun.istack.internal.NotNull;
Run Code Online (Sandbox Code Playgroud)
这里面编译后idea的作品,但如果运行构建通过gradle这样的build.gradle:
version '1.0-snaphshot_03.03.2017'
apply plugin: 'java'
targetCompatibility = '1.8'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
artifacts {
archives sourcesJar
}
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
error: package com.sun.istack.internal does not exist
import com.sun.istack.internal.NotNull;
error: cannot find …Run Code Online (Sandbox Code Playgroud) java ×8
null ×3
android ×1
chain ×1
collections ×1
dao ×1
google-api ×1
java-7 ×1
java-8 ×1
kotlin ×1
methods ×1
object ×1
oop ×1
refactoring ×1