[Java] - 람다식 2

김주형·2022년 7월 27일
0

Java

목록 보기
4/8

java.util.function 패키지

이 패키지에 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 정의해놓았다.

함수형 인터페이스메서드설명
java.lang.Runnablevoid run()매개변수도 없고, 반환값도 없음
Supplier Tget()매개변수는 없고, 반환값만 있음
Consumervoid accept(T t)
FunctionR apply(T t)
Predicateboolean test(T t)
BiConsumervoid accept(T t, U u)두개의 매개변수만 있고, 반환값이 없음
BiPredicateboolean test(T t, U u)조건식을 표현하는데 사용됨. 매개변수는 둘, 반환값은 boolean
BiFunctionR apply(T t, U u)두개의 매개변수를 받아서 하나의 결과를 반환
  • 수학에서 결과로 true 또는 false를 반환하는 함수를 Predicate 라고 한다.
  • 매개변수가 2개인 함수형 인터페이스는 이름 앞에 ‘Bi’가 붙는다.
  • Supplier는 매개변수는 없고 반환값만 존재하는데 메서드는 두 개의 값을 반환할 수 없으므로 BiSupplier가 없다.
  • 매개변수의 타입과 반환타입이 일치할 때는 Function 대신 UnaryOperator를 사용한다. (매개 변수 2개면 BinaryOperator)
// 조건식 표현에 사용되는 Predicate

Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";

if(isEmptyStr.test(s))
  System.out.println("This is an empty String.");

Function의 합성과 Predicate의 결합

Function의 합성

두 람다식을 합성해서 새로운 람다식을 만들 수 있다.
함수 f, g가 있을 때
f.andThen(g)는 함수 f를 먼저 적용하고 g 적용.
f.compose(g)는 함수 g를 먼저 적용하고 f 적용.

Predicate의 결합

여러 Predicate를 and(), or(), negate()로 연결해서 하나의 새로운 Predicate로 결합할 수 있다. Predicate의 끝에 negate()를 붙이면 조건식 전체가 부정이 된다.

Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 0;
Predicate<Integer> notP = p.negate();

// 100 <= i && (i < 200 || i%2==0)
Predicate<Integer> all = notP.and(q.or(r));
System.out.println(all.test(150));  // true
  • static 메서드인 isEqual()은 두 대상을 비교하는 Predicate를 만들 때 사용한다.
  • isEqual()의 매개변수로 비교대상을 하나 지정하고, 또 다른 비교대상은 test()의 매개변수로 지정한다.
Predicate<String> p = Predicate.isEqual(str1);
boolean result = p.test(str2);  //str1과 str2가 같은지 비교하여 결과를 반환

// 위의 두 문장을 하나로 합치면
boolean result = Predicate.isEqual(str1).test(str2);

메서드 참조(Method reference)

람다식이 하나의 메서드만 호출하는 경우,
메서드 참조를 통해 람다식을 간략히 할 수 있다.
'클래스명::메서드명'
또는 '참조변수::메서드명'

// 기존
Function<String, Integer> f = (String s) -> Integer.parseInt(s);

// 메서드 참조
Funcation<String, Integer> f = Integer::parseInt;
생성자를 호출하는 람다식도 메서드 참조로 변환 가능

Supplier<MyClass> s = () -> new MyClass();  // 람다식
Supplier<MyClass> s = MyClass::new; // 메서드 참조
배열 생성할 경우

Function<Integer, int[]> f = x -> new int[x]; // 람다식
Function<Integer, int[]> f2 = int[]::new; // 메서드 참조
profile
도광양회

0개의 댓글