반응형
📝메소드 레퍼런스
메소드 레퍼런스란 클래스에 포함된 메소드를 생략해 표현이 가능하다 이 점을 이용해 간략할 수도 있고 무엇보다 일급객체의 특징인 파라미터에 함수를 넣을 수 있다. (물론 적절한 함수형 인터페이스의 시그니처[함수형 인터페이스에 맞는 포맷]이면 메소드 레퍼런스를 안 쓰고도 가능하다)
- System.out::println
Arrays.asList(1, 2, 3, 4, 5)
.forEach(System.out::println);
forEach안에 System.out::println [클래스명:메소드명]을 넣을 수 있다.
함수형 인터페이스를 이용하면 파라미터 및 반환타입 추론이 가능하기 때문에 생략할 수 있다.
- 나만의 클래스:메소드를 축약해서 사용해보기
public class MethodLambdaTest {
@Test
public void testing(){
System.out.println(
Arrays.asList(new BigDecimal("10.0"), new BigDecimal("23"), new BigDecimal("5"))
.stream()
// .sorted() // ✅ 동일
// .sorted((bd1, bd2) -> bd1.compareTo(bd2)) // ✅ 동일
// .sorted(BigDecimalUtil::compare) // ✅ 동일
.sorted(BigDecimal::compareTo) // ✅ 동일
.collect(toList())
); // [5, 10.0, 23]
}
}
class BigDecimalUtil {
public static int compare(BigDecimal bd1, BigDecimal bd2){
return bd1.compareTo(bd2);
}
}
- sorted 함수 설명
Stream<T> sorted(Comparator<? super T> comparator)
...
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2)
}
sorted는 Comparator를 받고 Comparator의 경우 (T, T) -> int이기 때문에 생략해도 알아서 비교값들이 들어간다
- anyMatch에 equals 함수 적용시키기
@Test
public void testing(){
final String targetString = "c";
System.out.println(
Arrays.asList("a", "b", "c", "d")
.stream()
//.anyMatch(x -> x.equals("c")) // ✅ 동일
//.anyMatch(String::equals) // ❌ 동작 X
.anyMatch(targetString::equals) // ✅ 동일
//.anyMatch("c"::equals) // ✅ 동일
);
}
- anyMatch에 String::equals 동작 안 하는 이유
boolean anyMatch(Predicate<? super T> predicate);
...
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2)
}
anyMatch의 경우 Predicate 받고 Predicate의 경우 T -> boolean이기 때문에 String::equals의 반환 타입과 맞지만
"c".eqauls("d")와 같이 두개의 비교값 즉, 두개 파라미터가 필요하기 때문에 시그니처가 맞지 않아서 동작하지 않는다.
반응형