[Java8] 자바에서 제공하는 함수형 인터페이스

준우·2022년 11월 16일
0

Java

목록 보기
23/30
post-thumbnail

Function<T,R>

  • T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스

Apply 메소드

구현하기

package com.example.demo;

import java.util.function.Function;

public class Plus10 implements Function<Integer, Integer>{

	@Override
	public Integer apply(Integer t) {
		return t + 10;
	}

}

사용하기

package com.example.demo;

import java.util.function.Function;

public class Foo {
	public static void main(String[] args) {
		Function<Integer, Integer> plus10 = (i) -> i + 10;
		System.out.println(plus10.appply(1));

	}

}

함수 조합용 메소드

compose

  • compose()()안의 연산을 먼저 실행 시킨 뒤, 해당 결과 값을 사용하는 메소드이다.
package com.example.demo;

import java.util.function.Function;

public class Foo {
	public static void main(String[] args) {
    
		Function<Integer, Integer> plus10 = (i) -> i + 10;
		Function<Integer, Integer> multiply2 = (i) -> i * 2;
	
		Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
        System.out.println(multiply2AndPlus10.apply(2));
	}

}

위 코드를 실행시키는 경우 결과 값은 14가 나온다.
매개변수 i값으로 2를 받았고, compose 때문에 먼저 연산되는 multiply2i4로 만들었다.
이후 plus10 Function이 실행 되어 14가 리턴되는 것이다.

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

  • 고차 함수(Higher-Order Function): 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.

andThen

  • andThen()compose()와 달리 ()안의 연산을 나중에 실행 시킨 뒤, 해당 결과 값을 사용하는 메소드이다.
package com.example.demo;

import java.util.function.Function;

public class Foo {
	public static void main(String[] args) {
    
		Function<Integer, Integer> plus10 = (i) -> i + 10;
		Function<Integer, Integer> multiply2 = (i) -> i * 2;
        
	
        Function<Integer, Integer> multiply2AndPlus10 = plus10.andthen(multiply2);
        System.out.println(multiply2AndPlus10.apply(2));
	}

}

위 코드를 실행시키는 경우에는 결과 값이 24가 된다.
매개변수 2plus10에서 먼저 실행되어 12가 되고, 해당값을 multiply2에서 사용하기 때문이다.

BiFunction<T, U, R>

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

Consumer< T>

void Accept(T t)
  • T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
public class Foo{
	public static void main(String[] args) {
    	Consumer<Integer> printT = (i) -> System.out.println(i);
        printT.accept(10);
   }
}

결과 값으로 10이 리턴된다.

함수 조합용 메소드로 andThen 이 있다.

Supplier< T>

T get()
  • T 타입의 값을 제공하는 함수 인터페이스
public class Foo{
	public static void main(String[] args) {
    	Supplier<Integer> get10 = () -> 10;
        System.out.println(get10.get());
	}
}

결과 값으로 10이 리턴된다.

Predicate< T>

boolean test(T t)
  • T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
public class Foo{
	public static void main(String[] args) {
    	Predicate<String> startsWithJoon = (s) -> s.startsWith("joon");
        System.out.println(startsWithJoon.test("joon"));
   }
}

결과 값으로 true가 리턴된다.

함수 조합용 메소드로 And, Or, Negate가 있다.

package com.example.demo;

import java.util.function.Predicate;

public class Foo{
	public static void main(String[] args) {
    	Predicate<Integer> isOdd = (i)  ->  i%2!=0;
    	Predicate<Integer> isEven = (i) -> i%2==0; 
        System.out.println(isOdd.or(isEven).test(3)); 
}
}

위 코드는 결과 값으로 false가 리턴된다.

UnaryOperator< T>

  • Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스
  • Function<Integer, Integer> 과 같이 입력 타입 두개가 동일한 경우 UnaryOperator< T>로 대체해서 쓸 수 있다.

BinaryOperator< T>

  • BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입력값 두개를 받아 리턴하는 함수 인터페이스
  • BiFunction<Integer, Integer, Integer>BinaryOperator<Integer>로 대체할 수 있다.

Reference

0개의 댓글