모르지 않다는 것은 아는것과 다르다.

Java

함수형 인터페이스

채마스 2022. 2. 26. 00:48

함수형 인터페이스란

  • 아래와 같이 추상 메소드를 딱 하나만 가지고 있는 인터페이스
    public interface RunSomething {
        void doIt();  // abstract 가 생략된 것이다.
    }

    static void printName(){
        System.out.println("이름");
    }

    default void printAge(){
        System.out.println("28");
    }
  • static 메소드나 default 메소드의 유무와는 상관없이 추상메서드가 1개이면 함수형 인터페이스이다.
  • SAM (Single Abstract Method) 인터페이스
  • @FuncationInterface 애노테이션을 가지고 있는 인터페이스





람다 표현식

  • 위에서 정의한 RunSomething 인터페이스를 람다를 사용하지 않으면 아래와 같이 사용해야한다.
    RunSomething runsomething = new RunSomething() {
        @Override
        public void doIt() {
            System.out.println("Hello");
        }
    };
  • 람다 표현식을 사용한다면 아래와 같다.
    RunSomething runSomething = () -> System.out.println("Hello");
  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.





자바에서 함수형 프로그래밍 특징

  • 함수를 First class object로 사용할 수 있다. (함수를 Object 변수형태로 사용할 수 있다.)
  • 순수 함수 (Pure function)
    • 사이드 이팩트가 없다. (함수 밖에 있는 값을 변경하지 않는다.)
    • 상태가 없다. (함수 밖에 있는 값을 사용하지 않는다.)
  • 고차 함수 (Higher-Order Function)
    • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
  • 불변성





Java가 기본으로 제공하는 함수형 인터페이스

  • 자바에서 미리 정의해둔 자주 사용할만한 함수 인터페이스다.


Function<T, R>

  • T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스
    • R apply(T t)
  • 구현 방법
    • 클래스를 구현해서 사용
    public class Plus10 implements Function<Integer, Integer> {
        @Override
        public Integer apply(Integer Integer) {
            return integer + 10;
        }
    }

    public static void main(String[] args){
        Plus10 plus10 = new Plus10();
        System.out.println(plus10.apply(1));
    }
- 람다 사용 -> 클래스를 구현할 필요없다.
    public static void main(String[] args){
        Function<Integer, Integer> plus10 = (i) -> i + 10;
        System.out.println(plus10.apply(1));
    }
  • 함수 조합용 메소드
    public static void main(String[] args){
        Function<Integer, Integer> plus10 = (i) -> i + 10;
        Function<Integer, Integer> multi2 = (i) -> i * 2;

        plus10.compose(multi2).apply(2); // 2를 곱하고 10을 더한다
        plus10.andThen(multi2).apply(2); // 10에 2를 더하고 2를 곱한다.
    }
  - andThen
  - compose



BiFunction<T, U, R>

  • 두 개의 값(T, U)를 받아서 R 타입을 리턴하는 함수 인터페이스
    • R apply(T t, U u)





Consumer

  • T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
    • void Accept(T t)
  • 함수 조합용 메소드
    • andThen
  • ex> -> 출력만 해주는 함수
  Consumer<Integer> printT = (i) -> System.out.println(i);
  printT.accept(10);



Supplier

  • T 타입의 값을 제공하는 함수 인터페이스
    • T get()
  • ex>
  Supplier<Integer> get10 = () -> 10;
  get10.get();



Predicate

  • T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
    • boolean test(T t)
  • 함수 조합용 메소드
    • And
    • Or
    • Negate
  • ex>
  Predicate<String> str = (s) -> s.startsWith("one");
  str.test("one two")
  • "one" 으로 시작하기 때문에 true가 반환된다.





UnaryOperator

  • Function<T, R>의 특수한 형태로, 입력값과 리턴값의 타입이 동일한 경우
  • Function<Integer, Integer> plus10 = (i) -> i + 10; 
  • UnaryOperator<Integer> plus10 = (i) -> i + 10;





BinaryOperator

  • BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스
  • BiFunction<T, T, T>와 같다.




REFERENCES

  • 백기선님의 더 자바, Java 8

'Java' 카테고리의 다른 글

LazyEvaluation,Curry,IntStream  (0) 2022.03.06
Stream 응용  (0) 2022.03.06
제네릭  (0) 2022.02.26
접근 지정자  (0) 2022.02.26
인터페이스 기본 메소드와 스태틱 메소드  (0) 2022.02.26