Java / / 2023. 2. 1. 14:18

Predicate 결합 방법 / 컬렉션과 함수형 인터페이스 사용

반응형

 

 

해당 포스팅은 자바의 정석 인터넷 강의를 참고하여 작성한 글입니다.

필요하시다면 강의를 추가로 참고하셔도 될 것 같습니다 : )

 

 

💡 들어가기 전 간략정리

람다식

  • 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.");

 

 

함수형 인터페이스에 대한 상세한 내용은 아래의 글 참고

 

함수형 인터페이스 - java.util.function 패키지

해당 포스팅은 자바의 정석 무료 인터넷 강의를 참고하여 작성한 글입니다. 필요하시다면 강의를 추가로 참고하셔도 될 것 같습니다 : ) 💡 java.util.function 패키지 자주 사용되는 함수형 인터페

jjunn93.com

 


💡 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);

 

 


💡 컬렉션 프레임워크와 함수형 인터페이스

✔ 함수형 인터페이스를 사용하는 컬렉션 프레임웍 메서드

Collection Functional Interface

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());
}
  • 람다식을 사용하게 되면서 코드가 간결해 졌다.
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유