먼저 반복하는 forEach 메서드의 사용법은
ageOfPp.forEach((pp, age) -> System.out.println( pp + " is " + age + " years old" ));
정렬하는 메서드는 키 / 값 을 기준으로 정렬할 수 있다.
Map<String, String> movies = Map.ofEntries( Map.entry("헤르미온느", "해리포터"),
Map.entry("록시", "시카고"),
Map.entry("벨마", "시카고"),
Map.entry("에일린", "몬스터") );
System.out.println("movies"+ movies);
movies.entrySet().stream()
.sorted(Entry.comparingByKey())
.forEachOrdered(System.out::println); // 키값인 이름을 순서대로 처리
그래서 출력결과가
movies{벨마=시카고, 헤르미온느=해리포터, 록시=시카고, 에일린=몬스터}
록시=시카고
벨마=시카고
에일린=몬스터
헤르미온느=해리포터
이렇게 나온다.
키가 존재하지만 value 값이 null인 상황이면 객체.getOrDefault("나는키값","널이면출력") 이렇게 처리할 수도 있다.
computeIfAbsent : 제공된 키에 맞는 값이 없으면, 널이라면 키를 이용해서 새로운 값을 계산하고 맵에 추가함
computeIfPresent : 제공된 키가 존재하면 새값을 계산하고 맵에 추가
compute : 제공된 키로 새값을 계산하고 맵에 저장
lines.forEach(line ->
dataToHash.computeIfAbsent(line, // 맵에서 찾을 키
this::calculateDigest)); // 키가 존재하지 않으면 실행할 거
movies.computeIfAbsent("록시", name -> new ArrayList<>())
.add("시카고");
computeIfPresent는 현재 키와 관련된 값이 맵에 존재해서 널이 아닐때만 계산하는 것인데
movies.remove(key, value);
이렇게 사용하면 된다
지정된 키와 연관된 값이 없거나 널이면 merge를 사용해서 키를 널이 아닌 값과 연결하거나 연결된 값을 주어진 매핑 함수의 결과 값으로 대치하거나 결과가 널이면 항목을 제거시킬 수 있다.
moviesCount.merge(movieNm, 1L, (key, count) -> count + 1L);
forEach : 각 키, 값 쌍에 주어진 액션을 실행
reduce : 모든 키, 값 쌍을 제공된 리듀스 함수로 결과로 합침
search : 널이 아닌 값을 반환할 때까지 키,값 쌍에 함수를 적용