Programing

람다에 사용할 수있는 NOP (no-op)에 대한 메서드 참조가 있습니까?

crosscheck 2020. 12. 30. 19:00
반응형

람다에 사용할 수있는 NOP (no-op)에 대한 메서드 참조가 있습니까?


이것은 이상한 질문처럼 들릴 수 있지만 Java 8에서 Lambda에 대한 표준 no-op (즉, null 작업, null 패턴 메서드, no-operation, do-nothing 메서드) 메서드를 참조하는 방법이 있습니까?

현재 나는 a, say,를 취하는 메소드를 가지고 있으며, void foo(Consumer<Object>)no-op을주고 싶습니다. 다음과 같이 선언해야합니다.

foo(new Consumer<Object>() { 
  public void accept(Object o) { 
    // do nothing 
  }
}

다음과 같은 작업을 수행하고 싶습니다.

foo(Object::null)

대신. 비슷한 것이 있습니까?

이것이 다중 매개 변수 메소드에서 어떻게 작동하는지 확실하지 않습니다. 아마도 이것은 Java의 람다 부족 일 것입니다.


이것은 결핍이 아닙니다.

Java의 Lambda는 기능적 인터페이스의 인스턴스입니다. 이는 차례로을 단순화 할 수있는 Java 구조의 인스턴스에 추상화되어 하나 하나 개의 추상 메소드, 또는 SAM.

그러나이 SAM에는 여전히 유효한 프로토 타입이 있어야합니다. 귀하의 경우 Consumer<T>에는 아무것도하지 않는 no-op 원합니다 T.

그러나 여전히 필요합니다 Consumer<T>. 즉, 당신이 생각 해낼 수있는 최소한의 선언은 다음과 같습니다 :

private static final Consumer<Object> NOOP = whatever -> {};

NOOP필요한 곳에 사용하십시오 .


특정 경우에는 간단히 다음을 수행 할 수 있습니다.

foo(i -> {});

이는 람다식이 매개 변수를 수신하지만 반환 값이 없음을 의미합니다.


Function.identity()귀하의 요구에 맞게?

항상 입력 인수를 반환하는 함수를 반환합니다.


아무것도하지 않는 메서드에 대한 메서드 참조를 원한다면 가장 쉬운 방법은 아무것도하지 않는 메서드를 작성하는 것입니다. 이 예 Main::doNothing에서는 a Consumer<String>가 필요할 사용했습니다 .

class Main {

    static void doNothing(Object o) { }

    static void foo(Consumer<String> c) { }

    public static void main(String[] args) {
        foo(Main::doNothing);
    }
}

doNothingvarargs를 사용하여 버전을 제공하여 오버로드 할 수도 있습니다 .

static void doNothing(Object... o) { }

이 시그니처는 문자 그대로 모든 매개 변수 시퀀스를 허용합니다 (프리미티브도 자동 박싱되므로). 이렇게 Main::doNothing하면 함수 인터페이스의 메서드에 void반환 유형 이있을 때마다 전달할 수 있습니다. 예를 들어가 필요할 Main::doNothing통과 ObjLongConsumer<Integer>있습니다.


Function.Identity와 유사한 자체 NOOP 구현을 가질 수 있습니다.

static <T> Consumer<T> NOOP() {
    return t -> {};
}

참조 URL : https://stackoverflow.com/questions/29851525/is-there-a-method-reference-for-a-no-op-nop-that-can-be-used-for-anything-lamb

반응형