Higher-Order Function(HOF)

HYK·2022년 5월 11일
0

Java

목록 보기
2/4

Higher-Order Function 이란 ?

조건 1. function이 파라미터로 다른 function을 받는 function을 일컫는다.

ex) 매개변수가 Function<Integer,String> 이고 리턴값이 String인 HOF

Function<Function<Integer,String>,String>

조건 2. function이 리턴값이 function을 넘겨주는 function을 일컫는다.

ex) 매개변수가 String 이고 리턴값이 Function<Integer,String>인 HOF

Function<Integer,Function<Integer,String>>

둘중하나라도 만족하면 Higher-Order Function에 해당한다.

java8 이전에는 매개변수로 function을 리턴값으로 function을 사용 할 수 없었지만 이후에는 Lamdba Expressions이 추가되면서 다음과 같이 사용 가능하다. 이외에도 Method또한 function처럼 HOF가 되도록 Method Reference가 추가되었다.

사용예시

조건1

  • function1 은 매개변수로 Function을 받아 String으로 변환해준다
final Function<Function<Integer,String>,String> function1 = g -> g.apply(10);
		//매개변수로 받은 Function을 실행 시키는데 그Function의 매개변수로 10을 넣는다.
        String result = function1.apply(i -> String.valueOf("값은 ? " + i));
         /**
          *  function1에 매개변수로 주어질 Lambda Expressions 
          *  i에는 10이 들어가고 그값을 String으로 바꿔줌
          * */
        System.out.println("result = " + result);
        //실행결과 : 값은 ? 10

조건 2

  • function2 는 매개변수로 받은 Integer을 Function으로 바꿔 리턴해준다.
    final Function<Integer,Function<Integer,String>> function2 = 
		g -> g2 -> String.valueOf("첫번째 : "+g +"/ 두번째 : "+g2);
       /**
          *  g -> Integer value인 매개변수
          *  g2 -> String.valueOf("첫번째 : "+g +"/ 두번째 : "+g2);
          *  이부분은 리턴될 Lambda Expressions 이다.
          * */
    
        String result2 = function2.apply(10).apply(20);
        /**
         * f2.apply(10)는 결국 g2->String.valueOf("첫번째 : "+10 +"/ 두번째 : "+g2); 
         * 이라는 Lambda Expressions가 된다.
         * 여기선 그럼 위의 Lambda 을 한번더 실행하기 때문에 최종적으로 String value가 리턴된다.
         * */
        System.out.println("result2 = " + result2);

적용된곳

실제 우리가 사용하는 Stream의 Map, Filter, Reduce 같은 메서드들이 Higher-Order Function 라고 할 수 있다.

  • ex) map -> Function,List를 매개변수로 받고 이를 List로 리턴해주는 형태 조건1에 부합된다고 볼 수 있다.
  • Function의 identity 메서드 또한 HOF 라고 할 수 있다.
    private <T,R> List<R> map(final List<T> list, final Function<T,R> mapper) {
        final List<R> result= new ArrayList<>();
        for (final T t : list) {
            result.add(mapper.apply(t));
        }
        return result;
    }

어떤식으로 사용할 수 있나?

  • function을 합치는 용도로 사용할 수 있다.

ex) 각 매개변수의 값들을 String 형태로 이어붙이기

final Function<Integer,Function<Integer,Function<Integer,String>>> f = i -> i2 -> i3 -> "값 : "+i+i2+i3;
        String result3 = f.apply(1).apply(2).apply(3);
        System.out.println("result3  = " + result3);
        //결과 : result3  = 값 : 123
profile
Test로 학습 하기

0개의 댓글