이 패키지에 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 정의해놓았다.
함수형 인터페이스 | 메서드 | 설명 |
---|---|---|
java.lang.Runnable | void run() | 매개변수도 없고, 반환값도 없음 |
Supplier T | get() | 매개변수는 없고, 반환값만 있음 |
Consumer | void accept(T t) | |
Function | R apply(T t) | |
Predicate | boolean test(T t) | |
BiConsumer | void accept(T t, U u) | 두개의 매개변수만 있고, 반환값이 없음 |
BiPredicate | boolean test(T t, U u) | 조건식을 표현하는데 사용됨. 매개변수는 둘, 반환값은 boolean |
BiFunction | R apply(T t, U u) | 두개의 매개변수를 받아서 하나의 결과를 반환 |
// 조건식 표현에 사용되는 Predicate
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if(isEmptyStr.test(s))
System.out.println("This is an empty String.");
두 람다식을 합성해서 새로운 람다식을 만들 수 있다.
함수 f, g가 있을 때
f.andThen(g)는 함수 f를 먼저 적용하고 g 적용.
f.compose(g)는 함수 g를 먼저 적용하고 f 적용.
여러 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
Predicate<String> p = Predicate.isEqual(str1);
boolean result = p.test(str2); //str1과 str2가 같은지 비교하여 결과를 반환
// 위의 두 문장을 하나로 합치면
boolean result = Predicate.isEqual(str1).test(str2);
람다식이 하나의 메서드만 호출하는 경우,
메서드 참조를 통해 람다식을 간략히 할 수 있다.
'클래스명::메서드명'
또는 '참조변수::메서드명'
// 기존
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; // 메서드 참조