[java] Java에서 null이 아닌 첫 번째 값을 얻는 방법은 무엇입니까?

Java와 동등한 SQL이 있습니까? COALESCE 기능이 있습니까? 즉, 여러 변수의 첫 번째 null이 아닌 값을 반환하는 방법이 있습니까?

예 :

Double a = null;
Double b = 4.4;
Double c = null;

어떻게 든의 첫 번째 null이 아닌 값을 반환하는 문을 갖고 싶어 a, b그리고 c-이 경우, 반환 b, 또는 4.4. (sql 메소드와 같은 것-return COALESCE(a,b,c)). 나는 다음과 같이 명시 적으로 할 수 있음을 알고 있습니다.

return a != null ? a : (b != null ? b : c)

그러나이 작업을 수행하기위한 기본 제공 기능이 있는지 궁금했습니다.



답변

아닙니다.

당신이 얻을 수있는 가장 가까운 것은 :

public static <T> T coalesce(T ...items) {
    for(T i : items) if(i != null) return i;
    return null;
}

효율적인 이유로 일반적인 경우를 다음과 같이 처리 할 수 ​​있습니다.

public static <T> T coalesce(T a, T b) {
    return a == null ? b : a;
}
public static <T> T coalesce(T a, T b, T c) {
    return a != null ? a : (b != null ? b : c);
}
public static <T> T coalesce(T a, T b, T c, T d) {
    return ...
}


답변


답변

확인할 두 개의 변수 만 있고 구아바를 사용하는 경우 MoreObjects.firstNonNull (T first, T second)를 사용할 수 있습니다 .


답변

테스트 할 두 개의 참조 만 있고 Java 8을 사용하는 경우

Object o = null;
Object p = "p";
Object r = Optional.ofNullable( o ).orElse( p );
System.out.println( r );   // p

static 선택적을 가져 오는 경우 표현식이 나쁘지 않습니다.

불행히도 “여러 변수”의 경우는 선택적 방법으로는 불가능합니다. 대신 다음을 사용할 수 있습니다.

Object o = null;
Object p = null;
Object q = "p";

Optional<Object> r = Stream.of( o, p, q ).filter( Objects::nonNull ).findFirst();
System.out.println( r.orElse(null) );   // p


답변

LES2의 답변에 따라 오버로드 된 함수를 호출하여 효율적인 버전에서 일부 반복을 제거 할 수 있습니다.

public static <T> T coalesce(T a, T b) {
    return a != null ? a : b;
}
public static <T> T coalesce(T a, T b, T c) {
    return a != null ? a : coalesce(b,c);
}
public static <T> T coalesce(T a, T b, T c, T d) {
    return a != null ? a : coalesce(b,c,d);
}
public static <T> T coalesce(T a, T b, T c, T d, T e) {
    return a != null ? a : coalesce(b,c,d,e);
}


답변

이 상황에서는 일부 전처리 기가 필요합니다. 널이 아닌 첫 번째 값을 선택하는 함수 (정적 메소드)를 작성하면 모든 항목을 평가하기 때문입니다. 일부 항목이 메소드 호출 인 경우 문제가됩니다 (시간이 오래 걸리는 메소드 호출 일 수 있음). 그리고이 메소드는 앞에있는 항목이 널이 아닌 경우에도 호출됩니다.

이 같은 기능

public static <T> T coalesce(T ...items) 

바이트 코드로 컴파일하기 전에이 “coalesce function”의 사용법을 찾고이를 다음과 같은 구성으로 대체하는 전처리 기가 있어야합니다.

a != null ? a : (b != null ? b : c)

2014-09-02 업데이트 :

Java 8 및 Lambdas 덕분에 Java에서 진정한 통합이 가능할 수 있습니다! 중요한 기능 포함 : 특정 표현식은 필요할 때만 평가됩니다. 이전 표현식이 널이 아닌 경우 다음 표현식은 평가되지 않습니다 (메소드가 호출되지 않거나 계산 또는 디스크 / 네트워크 조작이 수행되지 않음).

Java 8 에 대한 기사를 작성했습니다 – 통합 – hledáme neNULLové hodnoty – (체코 어로 작성되었지만 모든 사람들이 코드 예제를 이해할 수 있기를 바랍니다).


답변

구아바로 할 수있는 일 :

Optional.fromNullable(a).or(b);

NPE가 발생하면 모두하지 않는 a하고 b있습니다null .

편집 : 나는 틀렸다, 그것은 NPE를 던진다. Michal Čizmazia 가 논평 한 올바른 방법 은 다음과 같습니다.

Optional.fromNullable(a).or(Optional.fromNullable(b)).orNull();