1.4 java.util.function 패키지
대부분의 메서드는 타입이 비슷한데, java.util.function 패키지에 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓음.
🔷 타입 문자 T는 Type을, R은 Return Type을 의미함.
- 조건식의 표현에 사용되는 Predicate
Function의 변형으로, 반환타입이 boolean이다. 조건식을 람다식으로 표현하는데 사용된다. - 매개변수가 두 개인 함수형 인터페이스
이름 앞에 접두사 'Bi'가 붙는다.
- UnaryOperator와 BinaryOperator
Function에서 매개변수의 타입과 반환 타입이 같다면 Function 대신 UnaryOperator를 사용할 수 있다. - 컬렉션 프레임웤과 함수형 인터페이스
🔷 Map객체를 한 번씩 순회하기 위해 Iterator를 이용해서 이터레이터화를 시키면 Map 객체가 Entry 타입의 이터레이터가 된 걸 반복문으로 돌렸었는데 이 작업을 forEach로 간략하게 수행할 수 있다.
LambdaEx04.java
package chap14.ex04;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class LambdaEx04 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0 ; i < 10 ; i++) {
list.add(i);
}
// list의 모든 요소를 출력
list.forEach(i -> System.out.print(i+","));
System.out.println();
// list에서 2 또는 3의 배수를 제거
list.removeIf(x -> x % 2 == 0 || x % 3 == 0);
System.out.println(list);
list.replaceAll(i -> i * 10); // list의 각 요소에 10을 곱함.
System.out.println(list);
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
// map의 모든 요소를 k,v 형식으로 출력.
map.forEach((k,v) -> System.out.print("{"+k+","+v+"},"));
}
}
LambdaEx05.java
package chap14.ex05;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
public class LambdaEx05 {
public static void main(String[] args) {
Supplier<Integer> s = () -> (int)(Math.random() * 100) + 1;
Consumer<Integer> c = i -> System.out.print(i + ", ");
Predicate<Integer> p = i -> i % 2 == 0;
// Function<Integer, Integer> f = i -> i/10*10; // i의 일의 자리를 없앤다. UnaryOperator<Integer> 인티져 두 개 쓸 거면 이거 쓰는 게 나음.
UnaryOperator<Integer> f = i -> i/10*10; // Function과 호환성 굿.
List<Integer> list = new ArrayList<>();
makeRandomList(s, list);
System.out.println(list);
printEvenNum(p, c, list); // 조건, 할일, 대상
List<Integer> newList = doSomething(f, list);
System.out.println(newList);
}
static <T> List<T> doSomething(Function<T, T>f, List<T> list) {
// static <T> List<T> doSomething(Function<T, T>f, List<T> list) {
List<T> newList = new ArrayList<T>(list.size());
for(T i : list) { // capacity : 10
newList.add(f.apply(i));
}
// newList.add(11); 을 하면 size는 11이 된다.
// 그 후 for문을 돌리면 20번 실행. (한 번 늘어날 때마다 capacity 단위만큼 늘어나서)
return newList;
}
static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
for(T i : list) {
if(p.test(i)) {
c.accept(i);
}
}
System.out.println("]");
}
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for(int i = 0 ; i < 10 ; i++) {
list.add(s.get());
}
}
}
interface Runnable {
void run();
// default doSomething() {
//
// }
}
❓ List<T> newList = new ArrayList<T>(list.size());
객체를 초기화 했을 때 무엇이 들어가 있을까? newList
를 콘솔에 찍어보면 ? []
로 출력된다.
✨ (참고) 자바에서 익명 클래스와 자바스크립트에서 익명 함수는 상당히 비슷하다.
자바스크립트에서도 람다식을 쓸 수 있다.
'JAVA' 카테고리의 다른 글
자바로 쇼핑몰 상품 이미지 크롤링 하기. (jsoup 라이브러리 이용) 21. 05. 30. (0) | 2021.05.30 |
---|---|
14장 람다와 스트림 21. 04. 30. (0) | 2021.05.05 |
통합 구현 (JSON을 이용한 파싱) 21. 03. 03. (0) | 2021.03.03 |
07장- 객체지향 프로그래밍Ⅱ(6. 추상클래스, 7. 인터페이스) 21. 02. 24. (0) | 2021.02.24 |
09장- java.lang패키지와 유용한 클래스 21. 02. 21. (0) | 2021.02.21 |