2016-09-11 2 views
1

내가 자바에서 람다 표현식을 사용하여 다음과 같은 방법 참조 코드를 이해하려고 해요 매개 변수 :자바 람다 표현식

interface MyFunc<T> { 

    boolean func(T v1, T v2); 
} 

class HighTemp { 

    private int hTemp; 

    HighTemp(int ht) { 
     hTemp = ht; 
    } 

    boolean sameTemp(HighTemp ht2) { 
     return hTemp == ht2.hTemp; 
    } 

    boolean lessThanTemp(HighTemp ht2) { 
     return hTemp < ht2.hTemp; 
    } 
} 

class InstanceMethWithObjectRefDemo { 

    static <T> int counter(T[] vals, MyFunc<T> f, T v) { 
     int count = 0; 
     for (int i = 0; i < vals.length; i++) { 
      if (f.func(vals[i], v)) { 
       count++; 
      } 
     } 
     return count; 
    } 

    public static void main(String args[]) { 
     int count; 

     HighTemp[] weekDayHighs = {new HighTemp(89), new HighTemp(82), 
      new HighTemp(90), new HighTemp(89), 
      new HighTemp(89), new HighTemp(91), 
      new HighTemp(84), new HighTemp(83)}; 

     count = counter(weekDayHighs, HighTemp::sameTemp, 
       new HighTemp(89)); 
     System.out.println(count + " days had a high of 89"); 

     HighTemp[] weekDayHighs2 = {new HighTemp(32), new HighTemp(12), 
      new HighTemp(24), new HighTemp(19), 
      new HighTemp(18), new HighTemp(12), 
      new HighTemp(-1), new HighTemp(13)}; 

     count = counter(weekDayHighs2, HighTemp::sameTemp, 
       new HighTemp(12)); 
     System.out.println(count + " days had a high of 12"); 

     count = counter(weekDayHighs, HighTemp::lessThanTemp, 
       new HighTemp(89)); 
     System.out.println(count + " days had a high less than 89"); 

     count = counter(weekDayHighs2, HighTemp::lessThanTemp, 
       new HighTemp(19)); 
     System.out.println(count + " days had a high of less than 19"); 
    } 
} 

내 질문입니다, 기능 sameTemp는 하나 개의 매개 변수가있는 이유는 무엇입니까? 인터페이스는 2 개의 매개 변수를 가져야한다는 것을 선언하므로 이해가되지 않습니다. 어쩌면 hTemp 인스턴스 변수로 둘 다 충분할 수 있습니까? 나는 자바에서 전체 참조 책이했다 거기에 저자는이 설명 : sameTemp( )lessThanTemp( ) :

인용문을

를 프로그램에서 HighTemp 두 개의 인스턴스 메소드를 가지고 있음을 알 수 있습니다. 두 개의 HighTemp 객체가 동일한 온도를 포함하면 첫 번째 객체는 true를 반환합니다. 호출하는 객체의 온도가 전달 된 객체의 온도보다 작 으면입니다. 각 메소드는 HighTemp 유형의 매개 변수를 가지며 각 메소드는 부울 결과를 반환합니다. 따라서 호출 객체 유형을 func( )의 첫 번째 매개 변수로 매핑하고 인수를 func( )의 두 번째 매개 변수로 매핑 할 수 있기 때문에 각각은 MyFunc 기능 인터페이스 과 호환됩니다.

고마워요!

+2

참조 http://stackoverflow.com/questions/32855138/how-does-a-method-reference-to-an-instance-method-of-an-arbitrary- object-of-ap 및 http://stackoverflow.com/questions/23139725/using-method-reference-instead-of-multi-argument-lambda 및 http : // stackoverflow.com/questions/22516331/whats-the-difference-instance-method-reference-types-in-java-8 (및 http://stackoverflow.com/questions/37037015/why-stringbuilderappend-is-biconsumerstringbuilder-string) – Tunaki

답변

10

OO 프로그래밍을 할 때 많은 사람들이 간과하는 것은 ... 실제로 구현 된 방법입니다. 가정 :

class C { 
    public int foo(int parm) { return parm; } 

요점은 "의"메소드를 호출의 아이디어는 객체는 추상화입니다. 어셈블러에서 어떻게 구현할 것인가? CPU가 실제로 그 코드를 실행할 수 있습니다. 당신은 깨닫습니다 : 거기에서 "부름"은 불가능합니다. 이 수준에서 함수는 메모리의 어딘가에 만 호출합니다. 그러나 함수가 그것의 소유 객체에 대해 어떻게 알 수 있을까요?!

뭔가 선도 몇몇 사람들은 알고있다 - 당신이 위의 코드를 작성할 수 있습니다

@Test 
public void testIt() { 
    assertThat(new C().foo(5), is(5)); 
} 
:

class C { 
    public int foo(C this, int i) { 
     System.out.println("i: " + i); 
     return i; 
    } 
} 

는 안전을 위해, 나는 또한 이클립스에 약간의 테스트를 썼다

일식이 잘 실행되고 단위 테스트가 통과되어 "i : 5"가 인쇄됩니다.

을 객체에 정의 할 때 항상 그 메소드에 주어진 (일반적으로 보이지 않는) 첫 번째 인수 "this"가 있습니다!

따라서 하나의 매개 변수 만 취하는 것처럼 보이지만 "누락 된"매개 변수는 메서드를 호출하는 개체입니다!

그리고 의미 : boolean func(T v1, T v2)는 ...가 boolean sameTemp(HighTemp this, HighTemp ht2) 같이 쓸 수있다 boolean sameTemp(HighTemp ht2) 같이 T. 타입의 파라미터를 두 가지 방법, 요청; et Voila : T 타입의 두 매개 변수.