안녕세계

[Java] 컬렉션 프레임워크와 함수형 인터페이스 본문

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

Junhong Kim 2020. 2. 19. 21:18
728x90
반응형

지난 포스팅에 이어서 본 포스팅에서는 Java8에서 컬렉션 프레임워크에 추가된 함수형 인터페이스에 대해 알아봅니다.

인터페이스 메서드 설명
Collection boolean removeIf(Predicate<T> filter) filter 조건의 element 제거
List void replaceAll(UnaryOperator<T> operator) 모든 element를 operator 수행 결과로 반환
Iterable void forEach(Consumer<T> action) 모든 element에 대해 action 수행
Map V compute(K key, BiFunction<K, V, V> f) 특정 key에 대해 f 수행
V computeIfAbsent(K key, Function<K, V> f) 특정 key가 없을 경우 f 수행 후 추가
V computeIfPresent(K key, BiFunction<K, V, V> f) 특정 key가 있을 경우 f 수행 후 반환
V merge(K key, V value, BiFunction<V, V, V> f) 특정 key에 대해 f 병합 수행
void forEach(BiConsumer<K, V> action) 모든 element에 대해 action 수행
void replaceAll(BiFunction<K, V, V> f) 모든 element에 대해 f 수행 결과로 반환

Collection

boolean removeIf(Predicate<T> filter)

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
  numbers.add(i);
}

numbers.removeIf(number -> number % 2 == 0);
System.out.println(numbers); // [1, 3, 5, 7, 9]

List

void replaceAll(UnaryOperator<T> operator)

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
  numbers.add(i);
}

numbers.replaceAll(number -> number * 10);
System.out.println(numbers); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

void forEach(Consumer<T> action)

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
  numbers.add(i);
}

numbers.forEach(number -> {
  System.out.print(number); // 0123456789
});

Map

V compute(K key, BiFunction<K, V, V> f)

해당 key를 반환 값으로 변경, key가 없을 경우 java.lang.NullPointerException 발생

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.compute("A", (key, value) -> value + 10);
System.out.println(map); // {A=11, B=2, C=3}

V computeIfAbsent(K key, Function<K, V> f)

key가 존재할 경우 수행하지 않음, key가 존재하지 않으면 key=value 값을 Map에 추가

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.computeIfAbsent("A", (key) ->  10);
System.out.println(map); // {A=1, B=2, C=3}
        
map.computeIfAbsent("D", (key) ->  10);
System.out.println(map); // {A=1, B=2, C=3, D=10}

V computeIfPresent(K key, BiFunction<K, V, V> f)

key가 존재할 경우 해당 key를 반환 값으로 변경, key가 존재하지 않으면 수행하지 않음 

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.computeIfPresent("A", (key, value) -> value * 10);
System.out.println(map); // {A=10, B=2, C=3}

map.computeIfPresent("D", (key, value) -> value * 10);
System.out.println(map); // {A=10, B=2, C=3}

V merge(K key, V value, BiFunction<V, V, V> f)

key가 존재할 경우 해당 key를 반환 값으로 변경, key가 존재하지 않으면 key=value 값을 Map에 추가

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.merge("A", 1, (key, value) -> map.get("A") + 10);
System.out.println(map);

map.merge("D", 4, (key, value) -> map.get("A") + 10);
System.out.println(map);

void forEach(BiConsumer<K, V> action)

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.forEach((key, value) -> System.out.print(value)); // 123

void replaceAll(BiFunction<K, V, V> f)

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
System.out.println(map); // {A=1, B=2, C=3}

map.replaceAll((key, value) -> value * 10);
System.out.println(map); // {A=10, B=20, C=30}

 

각 인터페이스가 어떤 결과를 가져오는지 한 눈에 볼 수 있도록 설명예제 소스를 함께 기록합니다.

Java8 컬렉션 프레임워크의 함수형 인터페이스를 사용할 때 이번 포스팅이 좋은 CheatSheet가 되기를 바랍니다!! 😎

감사합니다. 

 

728x90
반응형
Comments