람다에 사용할 수있는 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);
}
}
doNothing
varargs를 사용하여 버전을 제공하여 오버로드 할 수도 있습니다 .
static void doNothing(Object... o) { }
이 시그니처는 문자 그대로 모든 매개 변수 시퀀스를 허용합니다 (프리미티브도 자동 박싱되므로). 이렇게 Main::doNothing
하면 함수 인터페이스의 메서드에 void
반환 유형 이있을 때마다 전달할 수 있습니다. 예를 들어가 필요할 Main::doNothing
때 통과 할 수 ObjLongConsumer<Integer>
있습니다.
Function.Identity와 유사한 자체 NOOP 구현을 가질 수 있습니다.
static <T> Consumer<T> NOOP() {
return t -> {};
}
'Programing' 카테고리의 다른 글
C ++ 11 std :: to_string (double)-후행 0 없음 (0) | 2020.12.30 |
---|---|
방랑 할 수 없음- "공급자"설정 방법 (0) | 2020.12.30 |
JUnit5에서 Mockito를 사용하는 방법 (0) | 2020.12.29 |
실수로 체크인 취소 (0) | 2020.12.29 |
Python int를 빅 엔디안 바이트 문자열로 변환 (0) | 2020.12.29 |