이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.
함수는 하나의 값을 받아서 하나의 값을 리턴하는 것
Function<T,R>에서 T, R은 각각 타입이 다를 수 있기 때문에 <T, T>
나 <R, R>
이런 식으로 두지 않는다.
이를 apply
라는 메서드로 구현할 것
위 사진처럼 Function<Integer, Integer>
타입으로 apply()라는 메서드를 Multiply15라는 클래스로 구현했다.
정수 값이 하나 들어오면, 그것에 15를 곲한 정수 값이 반환된다.
이렇게 클래스 하나 더 만들어서 구현한 메서드를 가져오는 것보다 더 깔끔하게 람다 표현식을 활용할 수 있다.
받는 타입과 반환 타입이 둘 다 Integer형인 Function을 위 사진처럼 정의할 수 있다.
매개변수 i를 받고 i * 15를 반환하는 것을 구현할 수 있다.
중괄호로 묶인 긴 소스를 이렇게 한 줄로 줄일 수 있다.
Function인터페이스에서는 함수를 조합할 수 있는 메서드를 제공한다.
위 예시 사진을 보면, divide3AndMultiply15를 새로 만들어서 multiply15()에 compose()를 적용하여 divide3()을 먼저 실행시키도록 정의했다. divide3AndMultiply15에 apply()로 15라는 값을 넣으면, 3으로 먼저 나누고(divide3), 그 나눠진 값(5)을 multiply15()에 넣는다. 그러면 75라는 값이 나오게 된다.
위 사진처럼 apply의 매개변수에 10을 넣은 값으로 andThen()을 활용하면, 10에 15를 곱하고(multiply15) 3으로 나눠서(divide3) 50이라는 값을 얻을 수 있게 된다.
R apply(T t, U u)
void Accept(T t)
이런 식으로 리턴 없이 출력으로 활용할 수 있다.
andThen()
을 활용할 수 있다. T get()
위 사진처럼 람다 익스프레션에 인자를 넣을 필요가 없으며, 20을 리턴한다고만 정의해주면 무조건 20을 리턴하게 되는 것이다.
단, get()까지 추가로 체이닝을 해줘야지 온전한 20이라는 값을 얻을 수 있다. get()을 추가하지 않으면 레퍼런스가 출력된다.
"bruce"로 시작하는지 체크할 수 있고, 홀수인지/짝수인지 판별하도록 로직을 만들 수 있다.
짝수이면서 100으로 나눈 나머지가 0인지 판별하는 로직이 필요할 때, 즉 and/or 조건을 활용하여 true/false를 체크할 때 and()/or()를 활용할 수 있다.
isEqual(), negate() 등의 메서드도 사용 가능하다.
이렇게 negate()를 붙이면 기존에는 true였던 결과가 false로 바뀐다.
그 true/false의 결과에 반대로 만드는 것이 negate()이다.
이렇게 매개변수 타입과 반환 타입이 같으면, UnaryOperator를 이용하여 하나로 퉁칠 수 있다.
UnaryOperator도 Function을 상속받았기 때문에, Function에서 제공하는 default 메서드를 사용할 수 있다.
먼저 BiFunction을 이용한 소스이다.
BinaryOperator를 활용하면 Integer를 세 번씩이나 작성하지 않아도 된다.
더 자바, Java 8 - 백기선 강사님 강의를 토대로 정리했습니다.