2016-12-25 1 views
6

풍부한 프로파일 링으로 인해 Java 코드는 Nullable 객체의 메서드 결과 출력으로 어수선하게 쌓여 있습니다.java8 메소드 참조를 사용하는 Nullcheck 메소드가 가능합니까?

그것은이에 대한 정적 메서드를 작성하는이

namedObject == null ? "?" : namedObject.getName() 

처럼이 가능합니다 보인다? (예 : 이와 같이 보이기) :

Util.nvl(namedObject, NamedObject::getName, "?") 

무엇이 좋을까요? 나는 약간의 수색 한 google를 실험했지만 아무런 결과도 산출하지 못했다.

이 작동하지 않습니다

public static <T> T nvl(T value, Function<T, ?> method, T nullSubstition) { 
    return value == null ? nullSubstition : (T) method.apply(value); 
} 

컴파일러는 저에게 말한다 : 비 정적 메소드 getName()는 정적 컨텍스트

답변

8

귀하의 서명이 정확하지 않을 수 있습니다에서 참조 할 수 없습니다. 메소드가 NamedObject를 첫 번째 인수로 사용하여 (그래서 T는 NamedObject 임), String을 리턴한다. (그래서 T는 String이다.) 귀하의 방법의 제네릭이 제대로 정의되지 않은

public static <O, T> T nvl(O value, Function<? super O, ? extends T> method, T nullSubstition) { 
    return value == null ? nullSubstition : method.apply(value); 
} 
+1

멋진 답변, 고맙습니다. – Nachaz

+0

"nvl"연산이 아니지만 "getOrDefault"연산입니다. –

5

것, 더 많은 유연성을 허용,

public class Utils { 

    public static <O, T> T nvl(O value, Function<O, T> method, T nullSubstition) { 
     return value == null ? nullSubstition : method.apply(value); 
    } 

    static class NamedObject { 
     String getName() { 
      return "foo"; 
     } 
    } 

    public static void main(String[] args) { 
     NamedObject foo = null; 
     String name = Utils.nvl(foo, NamedObject::getName, "bar"); 
     System.out.println("name = " + name); // name = bar 

     foo = new NamedObject(); 
     name = Utils.nvl(foo, NamedObject::getName, "bar"); 
     System.out.println("name = " + name); // name = foo 
    } 
} 

더 좋은 서명 :

는 두 제네릭 형식 매개 변수가 필요합니다. 특정 유형의 객체 (인수로는 T 또는 주어진 예제에서는 NamedObject)를받는 메소드를 만들고 다른 유형의 객체 ( S)를 반환하는 메소드를 적용하려고합니다. 우아함이 다소 있지만 자바 (8)의 Optional가 (좀 더 우아한 방법이를 작성할 수 수

public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) { 
    return value == null ? nullSubstition : (S) method.apply(value); 
} 

참고 : 또는 주어진 예에서 String), 또는 기본 S 값을 전달 된 객체는 null 경우 보는 사람의 눈) :

public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) { 
    return Optional.ofNullable(value).map(method).orElse(nullSubstition); 
} 
+1

'Optional.ofNullable()'을 의미합니까? –

+1

@PatrickParker 예. 거기서 나 자신보다 앞서 :-) 눈치 채어 고쳐 주신 고마워! – Mureinik

+2

좋은 예. 아마도이 표기법의 축약이기 때문에이 함수의 좋은 이름은'optionalMapOrElse' 일 것입니다. –