2017-12-23 7 views
1

저는 지난 몇 달 동안 자바를 배우면서 막 함수에 들어가기 시작했습니다. 나는 최근에 IDE를 바꾸었고 이와 같은 코드에서 "메서드 참조로 바꿀 수있다"는 경고를 보았습니다. 리스트 for 메소드 참조 설명

List<Integer> intList = new ArrayList<>(); 
     intList.add(1); 
     intList.add(2); 
     intList.add(3); 

     intList.forEach(num -> doSomething(num)); 

    voiddoSomething(int num) { 
     System.out.println("Number is: " + num); 
    } 

는 일부 파고 후, 나는 대신에 라인

intList.forEach(num -> doSomething(num)); 

의 난 그냥

intList.forEach(this::doSomething); 

사용할 수있는이 단지 놀라운 것을 깨달았다. 며칠 전 나는 람다 (lambdas)에 대해서 알지 못했고 이와 같은 작업을하기 위해 루프를 사용하고있었습니다. 이제는 for 루프를 lambda로 바꿨으며 더 나은 방법으로 람다를 메소드 참조로 바꿀 수 있습니다. 문제는이 모든 것이 어떻게 내부적으로 작용하는지 실제로 이해할 수 없다는 것입니다. 누구든지 doSomething 함수가 호출되고 메소드 참조를 사용할 때 인수가 전달되는 방법을 설명하는 좋은 리소스를 설명하거나 제공 할 수 있습니까?

+0

https://stackoverflow.com/questions/25784337/lambda-with-non-static-methods- in-java-8) – Joe

+0

읽기 자습서 : [https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html] (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html) –

답변

1

이중 콜론은 매개 변수와 반환 유형이 기존 함수와 동일한 람다 식을 정의하기위한 단순한 구문 설탕입니다. lambda가 기존의 코드베이스에 더 쉽게 추가 될 수 있도록하기 위해 만들어졌습니다.

forEach 메서드를 List<Integer> 개체로 호출하면 Consumer 기능 인터페이스를 구현하는 개체를 매개 변수로 사용합니다. 귀하의 람다 num -> doSomething(num) 자체 가이 인터페이스의 공식적인 요구 사항을 충족 발생합니다.

따라서이 람다 식에 대한 구문 식 설탕으로 이중 콜론을 사용할 수 있습니다. 일반적

하면 다음 obj::func를 작성 params... 파라미터를 수락 방법 func 가진 개체 obj 있다면 람다 (params...) -> obj.func(params...) 동일하다. 귀하의 경우

othis::doSomethingnum -> doSomething(num)가 동등하므로, 정수 파라미터를 취하는 방법 doSomething()를 갖는다 (현재 오브젝트), this이다.

1

최근까지 기능 프로그래밍을 시작하기 전까지는 가능한 한 간단하고 직관적 인 방법으로 작업하기를 원했지만, 제공 한 작은 코드 만 사용하면 많게 낮은 수준의보기뿐만 아니라 사물의 상위 수준보기에서 모두.

사람 설명이나 해봐요 함수가 호출되는 방법을 설명하는 좋은 자료를 제공하고 우리가 방법 참조를 사용할 때 인수는 에 전달시겠습니까?

가 호출되는 doSomething 기능에 관계없이 우리가 method reference 또는 람다 식을 사용하는지 여부의 라이브러리 (internal iteration) 왼쪽 방법, 그래서 기본적으로 우리는 지정 무엇을하지 의미를 우리는 forEach 방법을 제공하는 방법 소스 코드 intList의 각 요소에 대해 실행하려는 동작 (함수)이며 반드시 작동에 대한 정보가 필요하지는 않습니다.

다음은 소스 intList의 각 요소에 대해 doSomething의 지정된 함수를 적용 (실행)하기 위해 라이브러리에 남겨 둡니다.

Method references은 특정 방법만을 호출하는 lambdas의 줄임말로 볼 수 있습니다. 이점은 명시 적으로 특정 메서드 이름을 참조하면 코드 가독성이 향상되므로 읽고 읽고 따르는 것이 더 쉬워지고 대부분의 경우 메서드 참조가있는 코드를 읽는 것이 좋은 문제 문으로 읽히는 이점이 있습니다.

동작을 허용하는 모든 메서드가 허용되는 함수 유형에 제한이 있으므로 지정된 함수가 forEach terminal operation으로 전달 될 수 없다는 것도 알아야합니다. 이는 java.util.function 패키지에 functional interfaces을 사용하여 수행됩니다.

마지막으로 리팩터링 측면에서 메소드 참조를 항상 사용할 수있는 것은 아니며, Java-8 이전에 사용한 코드보다 항상 lambdas expressions 코드를 사용하는 것이 더 좋습니다.

  • 리팩토링 익명 클래스를 lambda expressions
  • 리팩토링 람다 표현식 method references
  • 에 : 당신은 자바-8 기능을 학습 여행으로 계속하지만, 코드를 더 나은 수있는 몇 가지 팁을 시도 할 streams에 리팩토링 필수적 스타일 데이터 처리
([자바 8 비 정적 방식으로, λ의 가능한 복제