Stream API - stream().map().collect()
1. Stream API
(1) Stream API란?
- 기존에 배열이나 컬렉션을 사용하면서 코드의 길이가 길어지고 가독성이 떨어지며, 코드의 재사용이 힘들어지는 문제점을 극복하기 위해 Java SE 8부터 Stream API가 추가되었다.
-> Stream API는 데이터를 추상화하여 다루기 때문에 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있게 해준다.
(2) Stream API의 특징
① Stream은 외부 반복을 통해 작업하는 컬렉션과 달리 내부 반복을 통해 작업을 수행한다.
② Stream은 재사용이 가능한 컬렉션과 달리 단 한 번만 사용할 수 있다.
③ Stream은 원본 데이터를 변경하지 않는다.
④ Stream의 연산은 필터-맵(Filter-Map) 기반의 API를 사용하여 지연 연산을 통해 성능을 최적화한다.
⑤ Stream은 parallelStream() 메소드를 통한 병렬 처리를 지원한다.
(3) Stream API의 동작방식
- Stream의 생성 -> Stream의 변환(중개연산) -> Stream의 사용(최종연산)
- 데이터소스 -> 중개연산(필터) -> 중개연산(맵) -> 최종연산
2. stream().map().collect()
(1) Stream의 생성 - stream()
- 컬렉션은 stream() 메소드를 사용하며, 이는 스트림을 생성한다.
List<Map<String, Oject>> houseList = selectHouses();
Set<String> houseIdSet = houseList.stream();
(2) Stream의 중개연산 - map()
- map() 메소드는 저장된 값을 특정한 형태로 변환하는 데에 주로 사용된다.
MngBuildingModel mngBuildingModel = new MngBuildingModel();
List<Map<String, Object>> buildingIdList = mngBuildingService.getMngBuildingList(mngBuildingModel);
List<Map<String, Oject>> houseList = selectHouses();
Set<String> houseIdSet = houseList.stream()
.map(houseId -> (String) houseId.get("HOUSE_ID"));
위 코드는 houseList가 가지고 있는 HOUSE_ID의 값을 String으로 가져와 map으로 저장하고 있다.
(3) Stream의 최종연산 - collect()
- collect() 메소드는 인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림의 요소를 수집한다.
MngBuildingModel mngBuildingModel = new MngBuildingModel();
List<Map<String, Object>> buildingIdList = mngBuildingService.getMngBuildingList(mngBuildingModel);
List<Map<String, Oject>> houseList = selectHouses();
Set<String> houseIdSet = houseList.stream()
.map(houseId -> (String) houseId.get("HOUSE_ID"))
.collect(Collectors.toSet());
위 코드는 (2)의 코드에서 수행한 스트림을 Set으로 변환하고 있다.
// 기존 코드
List<Map<String, Object>> hrDataList = selectHrData();
UserModel userModel = new UserModel();
List<Map<String, Object>> userIdList = userService.getUserList(userModel);
Map<String, Object> userIdMap = new HashMap<String, Object>();
for(Map<String, Object> userId : userIdList) {
String key = (String) userId.get("USER_ID");
userIdMap.put(key, key);
}
Map<String, Object> hrUserIdMap = new HashMap<String, Object>();
for(Map<String, Object> hrUserId : hrDataList) {
String hrKey = (String) hrUserId.get("USER_ID");
hrUserIdMap.put(hrKey, hrKey);
}
userIdMap.keySet().removeAll(hrUserIdMap.keySet());
for (String key : userIdMap.keySet()) {
if (!key.contains("admin")) {
userModel.setUserId(key);
userService.updateUser(userModel);
}
}
// Stream API로 수정한 코드
List<Map<String, Object>> hrDataList = selectHrData();
UserModel userModel = new UserModel();
List<Map<String, Object>> userIdList = userMgmtService.getUserList(userModel);
Set<String> hrUserIdSet = hrDataList.stream()
.map(hrUserId -> (String) hrUserId.get("USER_ID"))
.collect(Collectors.toSet());
for (Map<String, Object> userId : userIdList) {
String key = (String) userId.get("USER_ID");
if (!hrUserIdSet.contains(key) && !key.contains("admin")) {
userModel.setUserId(key);
userService.updateUser(userModel);
}
}
출처: http://www.tcpschool.com/java/java_stream_concept
https://mangkyu.tistory.com/114