Java Lambda 표현 식(4):방법 참조(방법 참조)
25254 단어 Java
우 리 는 이미 앞의 자바 람 다 표현 식(1)에 있 습 니 다.입문 한 글 에서 람 다 표현 식 을 사용 하여 익명 방법 을 만 들 수 있다 고 말 했 습 니 다.그러나 어떤 경우,우리 의 Lambda 표현 식 은 다른 일 을 하지 않 고 기 존 방법 만 사용 할 수 있 습 니 다.이때,우 리 는 방법 을 인용 하여 방법 을 호출 할 수 있 는데,이것 은 코드 를 더욱 명확 하고 쉽게 읽 을 수 있다.
방법 참조
방법의 이름 을 통 해 기 존의 방법 을 인용 하면 더욱 치밀 하고 읽 기 쉬 운 Lambda 표현 식 입 니 다.
이해 하기 편리 하도록 우 리 는 다음 과 같은 종 류 를 만 들 었 다.
package com.wuxianjiezh.test;
public class MethodReferenceTest {
public interface Say {
void run();
}
public void invoke(Say say) {
say.run();
}
public static void main(String[] args) {
MethodReferenceTest test = new MethodReferenceTest();
test.invoke(new SayHello()); //
test.invoke(() -> System.out.println("Hello")); // Lambda
test.invoke(new SayHello()::run); //
}
}
class SayHello implements MethodReferenceTest.Say {
@Override
public void run() {
System.out.println("Hello");
}
}
위의 코드 는 인터페이스 구현 클래스,Lambda 표현 식 과 방법 참조 로 똑 같은 방법 으로 호출 되 는 것 을 보 여 줍 니 다.그 중에서
new SayHello()::run
은 인 스 턴 스 대상SayHello
의 방법 을 대표 한다.위의 방법 을 인용 하여
run
로 쓰 면 어떻게 되 는 지 생각해 보 세 요.결과 출력 이 있 습 니까?。。。
답 을 발표 하기 시작 했다.아무런 결과 출력 도 없 었 다.왜 이래?
。。。
우 리 는 다음 코드 를 사용 하여 설명 한다.
package com.wuxianjiezh.test;
public class MethodReferenceTest {
public interface Say {
void run();
}
public void invoke(Say say) {
System.out.println(say.getClass().getName());
say.run();
say.run();
}
public static void main(String[] args) {
MethodReferenceTest test = new MethodReferenceTest();
test.invoke(new SayHello()::run); // `SayHello` `run`
System.out.println("
-----------
");
test.invoke(SayHello::new); //
}
}
class SayHello implements MethodReferenceTest.Say {
public SayHello() {
System.out.println("SayHello ");
}
@Override
public void run() {
System.out.println("Hello");
}
}
위 코드 의 출력 결 과 는:
SayHello
com.wuxianjiezh.test.MethodReferenceTest$$Lambda$1/1225358173
Hello
Hello
-----------
com.wuxianjiezh.test.MethodReferenceTest$$Lambda$2/2121055098
SayHello
SayHello
우 리 는 상기 테스트 코드 에서
test.invoke(SayHello::new)
구조 함수(쓸데없는 말 인 것 같 음)를 인용 한 것 을 발견 할 수 있다.따라서 우리 가 호출 한 것 이SayHello::new
방법 이 라 고 해도 실제로 마지막 으로 실행 되 는 것 은 구조 함수 이다.방법 인용의 종류
방법 인용 은 다음 과 같은 몇 가지 로 나 눌 수 있다.
run
ContainingClass::staticMethodName
containingObject::instanceMethodName
ClassName::new
package com.wuxianjiezh.test;
import java.util.function.Consumer;
public class MethodReferenceTest {
private String name = "Jason Wu";
public void invoke(Consumer<String> consumer) {
consumer.accept(name);
}
public static void showName(String name) {
System.out.println(" :" + name);
}
public static void main(String[] args) {
MethodReferenceTest test = new MethodReferenceTest();
test.invoke(MethodReferenceTest::showName); //
}
}
특정 대상 의 인 스 턴 스 방법 참조
package com.wuxianjiezh.test;
import java.util.function.Consumer;
public class MethodReferenceTest {
private String name = "Jason Wu";
public void invoke(Consumer<String> consumer) {
consumer.accept(name);
}
public void showName(String name) {
System.out.println(" :" + name);
}
public static void main(String[] args) {
MethodReferenceTest test = new MethodReferenceTest();
test.invoke(test::showName); //
}
}
인용 구조 함수
package com.wuxianjiezh.test;
import java.util.function.Supplier;
public class MethodReferenceTest {
private String name = "Jason Wu";
public MethodReferenceTest() {
}
public void invoke(Supplier<MethodReferenceTest> supplier) {
MethodReferenceTest test = supplier.get();
test.showName(name);
}
public void showName(String name) {
System.out.println(" :" + name);
}
public static void main(String[] args) {
MethodReferenceTest test = new MethodReferenceTest();
test.invoke(MethodReferenceTest::new); //
}
}
특정 유형의 임의의 대상 의 인 스 턴 스 방법 을 참조 합 니 다.
package com.wuxianjiezh.test;
import java.util.Arrays;
public class MethodReferenceTest {
public static void main(String[] args) {
String[] array = {"B", "a", "D", "f", "c", "E"};
Arrays.sort(array, String::compareToIgnoreCase); //
Arrays.stream(array)
.forEach(System.out::println);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.