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 |