Programming Language/Java

[Java] Stream API - stream().map().collect()

Ma_Sand 2023. 10. 10. 14:46
반응형

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

 

반응형