2017-12-27 43 views

답변

2

메서드 호출에 상수를 전달하는 경우 음, 원래 메소드를 호출하는 다른 방법을 만들 수 있습니다

private static Integer getVal (Integer a) { 
    return getVal(1,2); 
} 

는 다음 두 번째 방법에 대한 방법의 참조를 사용할 수 있습니다.

즉 당신은

a -> getVal(1, 2) 

말했다

ClassName::getVal 

에, 훨씬 이해가되지 않습니다 변경할 수 있습니다.

추신 : 람다 식에서 a의 목적이 무엇인지 분명하지 않습니다. 무시하고 있기 때문에.

일반적으로 지정된 메소드의 메소드 참조가 필요한 기능 인터페이스의 단일 메소드의 서명과 일치하면이를 전달할 수 있습니다.

예 :

public static Integer apply (BinaryOperator<Integer> op, Integer a, Integer b) 
{ 
    return op.apply(a,b); 
} 

지금 당신이 호출 할 수 있습니다 : 원래 방법

apply(ClassName::getVal) 

.

+0

감사합니다. 그것은 정말로 질문입니다 - 정수 값을 람다에 전달하는 방법은 다음과 같습니다. (val1, val2) -> getVal (val1, val2) – user1052610

+0

@ user1052610 메서드 참조를 전달하는 위치에 따라 다릅니다. 인수가 2 개인 메소드가있는 함수 인터페이스가 필요한 메소드로 전달하는 경우 원래 메소드를 전달할 수 있습니다. – Eran

+0

Map.computeIfAbsent()의 두 번째 인수로 전달됩니다. 그래서 내가 원하는 것은 map.computeIfAbsent ("xxx", 클래스 : getVal)입니다. – user1052610

2

다음은 예입니다.

interface Operator { 
    int operate(int a, int b); 
} 

class Calc { 
    public static int add(int a, int b) { 
     return a + b; 
    } 
} 

class Main {  
    public static void main(String[] args) { 
     // using method reference 
     int result = operate(1, 2, Calc::add); 
     // using lambda 
     int result = operate(1, 2, (a, b) -> Calc.add(a, b)); 
    } 

    static int operate(int a, int b, Operator operator) { 
     return operator.operate(a, b); 
    } 
} 

당신은 (이 예에서 Operator)에있어서 참조 번호를 사용하는 인터페이스의 기능을 필요로한다. 또한 기능 인터페이스의 인스턴스를 해당 패러데이터로 받아들이는 메소드 (예 : operate(int a, int b, Operator operator)가 필요합니다.유일한 것)

int result = operate(wrapper, Calc::add); 
1

GETVAL (: 당신이 객체 래퍼가 필요한 경우

UPDATE는

operate 방법을 단지

static int operate(ObjectWrapper wrapper, Operator operator) { 
    return operator.operate(wrapper.getA(), wrapper.getB()); 
} 

operate 방법을 변경 한 다음 전화 적용 가능한 유형 i의 기능적 인터페이스가있는 곳에서 메소드 참조로 사용 가능해야한다. 예상 s의 같은

BiFunction 또는 IntBinaryOperator, 또는 (zhh의 answer에서와 같이) 사용자 정의 기능 인터페이스로 :

public static void main(String[] args) { 
     Integer result1 = calculate(1, 2, Second::getVal); 
     Integer result2 = calculateAsInt(1, 2, Second::getVal); 
    } 

    private static Integer getVal(Integer a, Integer b){ 
     return a + b; 
    } 

    private static Integer calculate(Integer a, Integer b, BinaryOperator<Integer> operator) { 
     return operator.apply(a, b); 
    } 

    private static int calculateAsInt(int a, Integer b, IntBinaryOperator operator) { 
     return operator.applyAsInt(a, b); 
    }