하루에 한 문제

[Java8] 새로운 collection api 본문

Dev/Java

[Java8] 새로운 collection api

dkwjdi 2021. 4. 10. 17:09

collection api로 forEach가 추가되었다.

이것도 모르고 for문으로 index관리하면서 내부를 탐색했는데 앞으로는 이방식을 써야겠다.

 

Iterable

List<Integer> list = new ArrayList<>();

list.add(1);
list.add(2);
list.add(3);

list.forEach(num -> System.out.println(num)) ;
//1
//2
//3

 

 

Collection

List

더이상 Collections.sort() 를 이용하지 않아도 된다.

List<Integer> list =new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);

list.sort((o1,o2)->(o1-o2));
// 1 2 3

 

Map

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

 

우선 옛날에 쓰던 방식과 한번 비교를 해보자.

만약 map에 있는 key:value쌍을 모두 알고 싶다면 이렇게 사용했을것이다.

HashMap<String, Integer> hm = new HashMap<>();

hm.put("one", 1);
hm.put("two", 2);
hm.put("three", 3);

for( String key : hm.keySet() ){
  System.out.println("key : " + key +", value :" + hm.get(key));
}

// key : one , value : 1
// key : two , value : 2
// key : three , value : 3

 

하지만 forEach와 람다식을 통해 간단하게 사용할 수 있다

HashMap<String, Integer> hm = new HashMap<>();

hm.put("one", 1);
hm.put("two", 2);
hm.put("three", 3);
		
hm.forEach((key, value)->System.out.println("key :" + key + ", value : " + value));

// key : one , value : 1
// key : two , value : 2
// key : three , value : 3

 

V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)
키값에 대해 어떻게 연산할지 정의해준다.

기존에 키에 대한 값이 없는 경우 V는 null로 생성된다.

 

예전에 내가 쓰던방식은 아래와 같은 방식으로 사용했다.

int num=hm.get("one");
hm.put("one", num+1);

 

 

하지만 compute를 사용해 사용하면 아래와 같이 쉽게 사용이 가능하다

System.out.println(hm.compute("three", (key, value)->value+1));
// 4
System.out.println(hm.compute("four", (key, value)->value+1)); 
// java.lang.NullPointerException​

//key :one, value : 1
//key :two, value : 2
//key :three, value : 4

 

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

기본적으로 compute메서드와 같다. 한번 영어를 해석해 보면 compute + 만약 + 없다면 대충 이런뜻이다..ㅎ

즉 키에 해당하는 값이 존재하지 않을 때에만 넘겨준 식을 실행한다는 뜻이다.

hm.put("four", 4);
hm.computeIfAbsent("four", key->5);

System.out.println(hm.get("four")); //4 

결과를 확인해보면 "four"라는 키가 존재했기 때문에 아무런 변화가 없다.

원래 쓰던 방식에서는 map.containsKey()를 사용해 키 값이 존재할 때, 존재하지 않을 때를 나누어서 코딩했었다.

 

V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction
computeIfAbsent()와는 반대로 키값이 존재할 경우에만 전달한 식을 실행한다.

hm.computeIfPresent("three", (key, value)-> value+1);
System.out.println(hm.get("three")); //4

람다식을 살펴보면, three라는 키가 존재하면 value를 +1해라 라는 뜻이다.

현재 hm안에 "three"라는 키가 존재하기 때문에 value인 3에서 +1증가된 4가 나오는 모습이다.

 

V getOrDefault(Object key, V defaultValue)

hm.getOrDefault("five" , 0);
//0

get을 하는데 만약 key값이 존재하지 않는다면 매개변수로 전달된 값을 return해줍니다.

 

 

더 많은 api가 있지만 내가 자주 사용할 것 같은 api만 정리해보았다.

 

 

 

참고

sticky32.tistory.com/entry/Java8-%EC%83%88%EB%A1%9C%EC%9A%B4-collection-api%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

'Dev > Java' 카테고리의 다른 글

Java Garbage Collection  (5) 2020.12.15
Comments