본문 바로가기

언어/Java

[Java8] 새로운 collection api에 대해서

java8의 새로운 collection api에 대해서 알아보자.

Iterable

void forEach(Consumer<? super T> action)

collection api로 forEach가 추가되었습니다. 더 이상 for문으로 index 등의 변수 관리를 하지 않고 내부 반복으로 처리가 가능해졌습니다.


List<Double> temperature = new ArrayList<Double<(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.forEach(s -> System.out.println(s));

temperature.forEach(System.out::println);

Collection

boolean removeIf(Predicate<? super E> filter)

필터 조건에 일치하는 인자를 삭제합니다.

List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.removeIf(integer -> integer % 2 == 0);

System.out.println(list);
// result : [1, 3, 5, 7, 9]

public void replaceAll(UnaryOperator<E> operator)

모든 인자를 operator에 따라서 바꿔줍니다.

List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.replaceAll(integer -> integer * integer);

System.out.println(list);
// result : [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

List

void sort(Comparator<? super E> c)

더이상 Collections.sort(collection, new Comparator ....)를 할필요가 없습니다.

List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.sort((o1, o2) -> o2 - o1);

System.out.println(list);
// result : [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Map

기본적으로 Map<String, Integer> map = new HashMap<>();와 같이 사전에 선언되어 있다고 가정한다.

void forEach(BiConsumer<? super K, ? super V> action)

기존의 map의 내용을 사용할 ㄸmap.entrySet().iterator()등의 방법을 썼지만 이제는 간단히 forEach와 람다식으로 사용할 수 있다.

map.put("A", 5);
map.put("B", 6);
map.put("C", 7);

map.forEach((key, value) -> {
    System.out.println(String.format("%s, %d", key, value));
});

//result : A, 5
           B, 6
           C, 7

V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)

키값에 대해서 어떻게 연산할지 정의합니다. 기존에 키에 대한 값이 없는 경우 V는 null로 생성됩니다. remappingFunction 리턴 값은 키의 값으로 저장됩니다.

map.put("A", 1);

System.out.println(map.compute("A", (s, integer) -> integer+1));
// result : 2
System.out.println(map);
// {A=2}

만약 이전의 자바로 했다면 아래와 같았을 것이다.

map.put("A", 1);

int number = map.get("A");
map.put("A", ++number);

System.out.println(number);

V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

기본적으로 compute메서드와 같다. 하지만 키에 해당하는 값이 존재하지 않을 때에만 넘겨준 람다식을 사용한다.

map.put("A", 5);
map.computeIfAbsent("A", key -> 10);

System.out.println(map.get("A"));
// result : 5

이전의 자바에서는 map.containsKey("A")등을 사용하여 if문으로 있을 경우와 없을 경우를 나눠 사용했던 반면 람다와 위 api를 사용해서 비교적 쉽게 구현할 수 있었다.

V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction

computeIfAbsent와 반대로 존재할 경우에만 전달한 람다를 실행한다.

map.put("A", 5);

System.out.println(map.computeIfPresent("A", (s, number) -> number*number));
// result : 25

System.out.println(map.computeIfPresent("B", (s, number) -> 10));
// result : null

V getOrDefault(Object key, V defaultValue)

메서드 명 그대로 가지고 오거나 없으면 설정한 기본 값을 반환한다.

// C가 설정되지 않았음

map.getOrDefault("C", 77);
// result : 77

V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction

키와 값을 주고 람다식으로 기존 값과 새로준 value값을 2개의 소비하는 BiFunction을 인자로 받는다.

새 값이 대체가 아닌 기존 값과 합쳐질 경우 유용하다. (평균, 합산 등에 쓰일 수 있다.)

map.put("A", 5);

System.out.println(map.merge("A", 10, Integer::sum));
// result : 15

V putIfAbsent(K key, V value)

없을 경우에만 값을 넣는다. 이전의 자바라면 있는지 검사하고 없을 경우에만 값을 넣는 형식으로 사용했을 것이다. 하지만 아래 api를 사용하면 1줄만에 사용이 동일 기능을 구현할 수 있다.

map.put("A", 5);

System.out.println(map.putIfAbsent("A", 1));

boolean remove(Object key, Object value)

기존의 remove(Object key)는 단순히 해당 키의 값을 삭제했지만 위 메서드는 key와 value가 둘다 일치할 경우에만 삭제된다. 같지 않을 경우 false같고 삭제됬을 경우에는 true를 반환한다.

map.put("A", 5);

System.out.println(map.remove("A", 1));
System.out.println(map);

//result : false
           {A=5}

V replace(K key, V newValue)

지정된 키의 값을 새로운 값으로 교체한다. 반환 값으로는 기존 값을 반환한다.

map.put("A", 5);

System.out.println(map.replace("A", 1));
System.out.println(map);
//result : 5
           {A=1}

boolean replace(K key, V oldValue, V newValue)

삭제와 동일하다 oldValue가 맞지 않으면 교체되지 않으며 false를 반환한다.

map.put("A", 5);

System.out.println(map.replace("A", 1, 10));
System.out.println(map);

//result : false
           {A=5}

void replaceAll (BiFunction<? super K, ? super V, ? extends V> function)

인자로 기존의 키와 값이 주어지는 BiFunction을 유일한 인자로 가지고 있다. 이 함수의 반환 값이 기존 값을 교체한다.

map.put("A", 5);

map.replaceAll((s, num) -> num*num);
System.out.println(map);
//result : {A=25}


'언어 > Java' 카테고리의 다른 글

[도구] VSC 설정파일  (0) 2017.02.05
classpath에 있는 file(resources) 읽어오기  (0) 2016.12.30