itsource

C#에 null margeing 연산자(--)와 동등한 Java가 있습니까?

mycopycode 2022. 9. 12. 11:49
반응형

C#에 null margeing 연산자(--)와 동등한 Java가 있습니까?

자바에서 다음 코드와 유사한 작업을 할 수 있습니까?

int y = x ?? -1;

상세 정보??

슬프게도-아니다.가능한 한 가까운 것은 다음과 같습니다.

int y = (x != null) ? x : -1;

물론 필요한 경우 라이브러리 메서드로 정리할 수 있지만(길이를 크게 줄일 수 있을 것 같지는 않습니다), 구문 수준에서는 이보다 더 간결하게 사용할 수 있는 것은 없습니다.

Guava는 MoreObjects라고 불리는 유사한 작업을 수행하는 메서드를 가지고 있습니다. 번째 Non Null(T,T)

Integer x = ...
int y = MoreObjects.firstNonNull(x, -1);

이것은 당신이 다음과 같은 것을 가지고 있을 때 더 도움이 된다.

int y = firstNonNull(calculateNullableValue(), -1);

비용이 많이 드는 메서드를 두 번 호출하거나 코드 내의 로컬 변수를 두 번 참조할 필요가 없기 때문입니다.

간단한 답변: 아니오

스태틱 유틸리티 메서드를 작성하는 것이 최선입니다(이를 통해 Import할 수 있습니다).import static구문)

public static <T> T coalesce(T one, T two)
{
    return one != null ? one : two;
}

위의 내용은 Guava의 방법과 동일합니다.firstNonNull@ColinD에 의해 처리되지만 일반적으로는 더 확장될 수 있습니다.

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

아니요. 회피책 함수는 & & 및 | do와 같은 진정한 늘 결합 연산자 단락이 아닙니다.즉, 첫 번째 식이 늘일 경우에만 두 번째 식을 평가하려고 합니다.

Apache Commons Lang 3의 다른 옵션입니다ObjectUtils.firstNonNull(T...).나는 Guava와 달리 이 방법을 선호합니다. 왜냐하면, 이 방법은 던지지 않습니다.Exception그것은 단순히 돌아올 것이다.null;

Java의 프리미티브는 null일 수 없으므로 이 문장은 개념적으로 의미가 없습니다.단, 래퍼 클래스(Integer, Character 등) 및 기타 인스턴스화 가능한 클래스는 null일 수 있습니다.

이 사실 외에 null 병합 연산자에 대한 짧은 구문은 없습니다.확장 양식을 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/5223044/is-there-a-java-equivalent-to-null-coalescing-operator-in-c

반응형