Java Lambda 표현 식(4):방법 참조(방법 참조)

25254 단어 Java
Java Lambda 표현 식(4):방법 참조(방법 참조)
  • 방법 인용 이 무엇 입 니까
  • 방법 인용의 종류
  • 정적 방법 인용
  • 특정 대상 의 실례 를 인용 하 는 방법
  • 구조 함수 인용
  • 특정 유형의 임 의 대상 을 인용 하 는 인 스 턴 스 방법
  • 인용
    우 리 는 이미 앞의 자바 람 다 표현 식(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);
        }
    }
    

    좋은 웹페이지 즐겨찾기