1. 소개
이 튜토리얼에서, 우리는 사용하는 방법에 대한 몇 가지 예 논의 할 것이다 자바 스트림 들 과 함께 작업에 Map 들 . 이러한 연습 중 일부는 양방향 Map 데이터 구조를 사용하여 해결할 수 있지만 여기서는 기능적 접근 방식에 관심이 있습니다.
먼저 Maps 및 Stream 작업에 사용할 기본 아이디어를 설명합니다 . 그런 다음 Stream 을 사용 하는 Maps 및 구체적인 솔루션과 관련된 몇 가지 다른 문제를 제시합니다 .
2. 기본 아이디어
주목해야 할 주요 사항은 Stream 은 Collection 에서 쉽게 얻을 수있는 요소의 시퀀스라는 것입니다 .
맵 은 순서없이 키에서 값으로 매핑하는 구조가 다릅니다. 그러나 이것이 Map 구조를 다른 시퀀스로 변환 할 수 없다는 것을 의미하지는 않습니다 . 그러면 Stream API로 자연스럽게 작업 할 수 있습니다.
Map 에서 다른 Collection 을 얻는 방법을 살펴 보겠습니다. 그런 다음 Stream으로 피벗 할 수 있습니다 .
Map<String, Integer> someMap = new HashMap<>();
키-값 쌍 세트를 얻을 수 있습니다.
Set<Map.Entry<String, Integer>> entries = someMap.entrySet();
Map 과 관련된 키 세트를 가져올 수도 있습니다 .
Set<String> keySet = someMap.keySet();
또는 값 세트로 직접 작업 할 수 있습니다.
Collection<Integer> values = someMap.values();
이들 각각은 컬렉션에서 스트림을 가져 와서 컬렉션을 처리 할 수있는 진입 점을 제공합니다.
Stream<Map.Entry<String, Integer>> entriesStream = entries.stream();
Stream<Integer> valuesStream = values.stream();
Stream<String> keysStream = keySet.stream();
3. 얻기 Map 사용의 키 스트림 의
3.1. 입력 데이터
Map 이 있다고 가정 해 봅시다 .
Map<String, String> books = new HashMap<>();
books.put(
"978-0201633610", "Design patterns : elements of reusable object-oriented software");
books.put(
"978-1617291999", "Java 8 in Action: Lambdas, Streams, and functional-style programming");
books.put("978-0134685991", "Effective Java");
"Effective Java"라는 책의 ISBN을 찾는 데 관심이 있습니다.
3.2. 일치 항목 검색
Google Map 에 책 제목이 존재 하지 않으므로 관련 ISBN이 없음을 나타낼 수 있기를 원합니다. 옵션 을 사용하여 다음 을 표현할 수 있습니다.
이 예에서 해당 제목과 일치하는 책의 키에 관심이 있다고 가정 해 보겠습니다.
Optional<String> optionalIsbn = books.entrySet().stream()
.filter(e -> "Effective Java".equals(e.getValue()))
.map(Map.Entry::getKey)
.findFirst();
assertEquals("978-0134685991", optionalIsbn.get());
코드를 분석해 봅시다. 먼저 이전에 본 것처럼 Map 에서 entrySet 을 가져옵니다 .
제목이 "Effective Java"인 항목 만 고려하므로 첫 번째 중간 작업은 필터가 됩니다.
전체 맵 항목 에는 관심이 없지만 각 항목의 키에 관심이 있습니다. 따라서 다음 연결 중간 작업은 바로 그 작업을 수행합니다. 이것은 우리가 찾고 있던 제목과 일치하는 항목에 대한 키만 포함하는 새 스트림을 출력으로 생성 하는 맵 작업입니다.
하나의 결과만을 원하기 때문에, 우리는 스트림 의 초기 값을 Optional 객체 로 제공 할 findFirst () 터미널 연산을 적용 할 수 있습니다 .
제목이없는 경우를 보겠습니다.
Optional<String> optionalIsbn = books.entrySet().stream()
.filter(e -> "Non Existent Title".equals(e.getValue()))
.map(Map.Entry::getKey).findFirst();
assertEquals(false, optionalIsbn.isPresent());
3.3. 여러 결과 검색
이제 문제를 변경하여 하나가 아닌 여러 결과를 반환하는 방법을 살펴 보겠습니다.
여러 결과를 반환하려면 다음 책을 Map에 추가해 보겠습니다 .
books.put("978-0321356680", "Effective Java: Second Edition");
이제 "Effective Java"로 시작하는 모든 책을 찾으면 두 개 이상의 결과가 반환됩니다.
List<String> isbnCodes = books.entrySet().stream()
.filter(e -> e.getValue().startsWith("Effective Java"))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
assertTrue(isbnCodes.contains("978-0321356680"));
assertTrue(isbnCodes.contains("978-0134685991"));
이 경우에 수행 한 작업은 맵 의 값이 문자열 같음 을 비교하는 대신 "Effective Java"로 시작 하는지 확인하기 위해 필터 조건을 교체하는 것입니다 .
이번에는 우리가 수집 결과를 대신 첫 따기의, 그리고에 일치를 넣어 List .
4. 받고 Map 사용의 값 스트림 의
이제Map의 다른 문제에 집중 해 보겠습니다. 대신 취득의 ISBN을 에 기초 타이틀을 , 우리가 시도하고 얻을 것이다 제목 에 기초 ISBN이 있습니다.
원래 Map을 사용합시다 . ISBN이 '978-0'으로 시작하는 제목을 찾으려고합니다.
List<String> titles = books.entrySet().stream()
.filter(e -> e.getKey().startsWith("978-0"))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
assertEquals(2, titles.size());
assertTrue(titles.contains(
"Design patterns : elements of reusable object-oriented software"));
assertTrue(titles.contains("Effective Java"));
이 솔루션은 이전 문제 세트의 솔루션과 유사합니다. 엔트리 세트를 스트리밍 한 다음 필터링, 매핑 및 수집합니다.
또한 이전과 마찬가지로 첫 번째 일치 항목 만 반환하려면 map 메서드 이후에 모든 결과를 List 에 수집하는 대신 findFirst () 메서드를 호출 할 수 있습니다.
5. 결론
이 기사에서는 기능적인 방식으로 Map 를 처리하는 방법을 설명했습니다 .
특히, 연결된 컬렉션을 Map 에 사용하도록 전환하면 Stream을 사용한 처리 가 훨씬 쉽고 직관적이라는 것을 알았습니다.
물론이 기사의 모든 예제는 GitHub 프로젝트 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/java-maps-streams
'Java' 카테고리의 다른 글
Java 8의 기능 인터페이스 (0) | 2021.03.10 |
---|---|
스프링 부트의 활성 및 준비 상태 프로브 (0) | 2021.03.10 |
자바 HashMap 가이드 (0) | 2021.03.10 |
Spring YAML 구성 방법 (0) | 2021.03.09 |
Spring을 사용한 Apache Kafka 사용방법 (0) | 2021.03.09 |