답변
메서드 호출에 상수를 전달하는 경우 음, 원래 메소드를 호출하는 다른 방법을 만들 수 있습니다
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)
.
감사합니다. 그것은 정말로 질문입니다 - 정수 값을 람다에 전달하는 방법은 다음과 같습니다. (val1, val2) -> getVal (val1, val2) – user1052610
@ user1052610 메서드 참조를 전달하는 위치에 따라 다릅니다. 인수가 2 개인 메소드가있는 함수 인터페이스가 필요한 메소드로 전달하는 경우 원래 메소드를 전달할 수 있습니다. – Eran
Map.computeIfAbsent()의 두 번째 인수로 전달됩니다. 그래서 내가 원하는 것은 map.computeIfAbsent ("xxx", 클래스 : getVal)입니다. – user1052610
다음은 예입니다.
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);
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);
}
왜 당신이 필요하다고 생각합니까? – shmosel