[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 ...
}
답변
아파치 커먼즈 랭 3
ObjectUtils.firstNonNull(T...)
자바 8 스트림
Stream.of(T...).filter(Objects::nonNull).findFirst().orElse(null)
답변
확인할 두 개의 변수 만 있고 구아바를 사용하는 경우 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();