반응형
해당 포스팅은 자바의 정석 인터넷 강의를 참고하여 작성한 글입니다.
필요하시다면 강의를 추가로 참고하셔도 될 것 같습니다 : )
💡 들어가기 전 간략정리
람다식
- JDK 1.8 부터 추가
- 메서드를 하나의 식으로 표현
- 메서드를 작성하기 위해서는 Class가 필요한데, 람다식은 바로 작성 가능하다.
- 또한 메서드의 매개변수로 람다식을 전달 가능하다.
함수형 인터페이스
- 추상 메서드를 하나만 가지는 인터페이스로 람다식을 다루기 위해 사용한다.
- 인터페이스를 선언한 후, 람다식으로 초기화 하여 사용한다.
java.util.function 패키지 → 대표적인 함수형 인터페이스 Predicate<T>
- 함수형 인터페이스를 사용할 때, 매번 새로 정의하는 것 보다는 java.util.function 패키지의 인터페이스를 활용하는 것이 이롭다.
Predicate<String> isEmptyStr = s -> s.length() == 0; //람다식의 반환 type boolean
String s = "";
if(isEmptyStr.test(s)) // if(s.length() == 0) //test는 람다식 메서드 이름
System.out.println("This is an empty String.");
함수형 인터페이스에 대한 상세한 내용은 아래의 글 참고
💡 Predicate의 결합(default 메서드)
- Predicate를 아래의 함수로 결합하여 해로운 Predicate로 만들어 사용할 수 있다.
- and() = &&
- or() = ||
- 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(); // i >= 100
Predicate<Integer> all = notP.and(q).or(r); // 100 <= i && i < 200 || i % 2 == 0
Predicate<Integer> all2 = notP.and(q.or(r)); // 100 <= i && (i < 200 || i % 2 == 0)
----------------------------------------------------
System.out.println(all.test(2)); //true
System.out.println(all2.test(2)); //false
참고 - 인터페이스가 가질 수 있는 메서드
- 추상메서드
- static 메서드(JDK 1.8)
- default 메서드 (JDK 1.8)
Predicate - is Equal() 사용 (static 메서드)
boolean result = Predicate.isEqual(str1).test(str2);//str1.equals(str2);
Function의 합성
두 람다식을 합성하여 새로운 람다식을 만들 수 있다.
- f.andThen(g) : f를 먼저 적용한 뒤, g를 적용한다.
- f.compose(g) : g를 먼저 적용한 뒤, f를 적용한다. = g.andThen(f)
Function<String, Integer> f = (s) -> Integer.parseInt(s, 16);
Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
Function<String, String> h = f.andThen(g);
Function<Integer, Integer> h2 = f.compose(g);
💡 컬렉션 프레임워크와 함수형 인터페이스
✔ 함수형 인터페이스를 사용하는 컬렉션 프레임웍 메서드
list.forEach(i -> System.out.print(i + ",")); //list의 모든 요소를 출력
list.removeIf(x -> x % 2 == 0 || x % 3 == 0); //2 또는 3의 배수를 제거
list.replaceAll(i -> i*10); //모든 요소에 10을 곱한다.
map.forEach((k,v) -> System.out.println("{" + k + "," + v + "},"));//map의 모든 요소를 {k,v} 형식으로 출력
//----- list.forEach(i -> System.out.print(i + ",")); => 람다식을 사용하지 않았을 경우의 코드 ----
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
- 람다식을 사용하게 되면서 코드가 간결해 졌다.
반응형
'Java' 카테고리의 다른 글
스트림(Stream)과 스트림의 특징 (0) | 2023.02.03 |
---|---|
메서드 참조(method reference) - 람다식을 더 간단하게 (0) | 2023.02.02 |
함수형 인터페이스 - java.util.function 패키지 (0) | 2023.02.01 |
[Java] 람다식과 작성 방법 - 함수형 인터페이스 사용 (매개변수, 반환타입) (0) | 2023.01.31 |
QuerydslPredicateExecutor - querydsl 조건 조회 간단히 사용하기 (0) | 2023.01.18 |