하루에 한 문제
[Java8] 새로운 collection api 본문
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만 정리해보았다.
참고
'Dev > Java' 카테고리의 다른 글
Java Garbage Collection (5) | 2020.12.15 |
---|