티스토리 뷰

일하면서 사용한 java stream 몇 가지 예제들을 기록해둔다.

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamFilter01 {

	public static void main(String[] args) {
		HashMap<String, Object> user01 = new HashMap<String, Object>();
		user01.put("name", "김땡땡");
		user01.put("age", 23);
		user01.put("company", "A company");

		HashMap<String, Object> user02 = new HashMap<String, Object>();
		user02.put("name", "이땡땡");
		user02.put("age", 34);
		user02.put("company", "B company");

		HashMap<String, Object> user03 = new HashMap<String, Object>();
		user03.put("name", "박땡땡");
		user03.put("age", 31);
		user03.put("company", "A company");

		// 기준 데이터
		List<HashMap<String, Object>> userInfoList = new ArrayList<HashMap<String, Object>>();
		userInfoList.add(user01);
		userInfoList.add(user02);
		userInfoList.add(user03);

		
		/*
		 * 01. 특정 키의 값들만 배열로 뽑아내기.
		 */
		Object[] userCompany = userInfoList.stream().map(m -> m.get("company")).toArray();

		// Object배열을 String배열로 변환
		String[] userCompanyStrArr = Arrays.stream(userCompany).toArray(String[]::new);
//		String[] userCompanyStr = Arrays.copyOf(userCompany, userCompany.length, String[].class);
		
		// [A company, B company, A company]
		System.out.println(Arrays.toString(userCompanyStrArr));
		
		
		/*
		 * 02. 특정 키를 기준으로 중복 제거  
		 */
		List<HashMap<String,Object>> distinctMapList = userInfoList.stream().filter(distinctByKey(x -> Arrays.asList(x.get("company")))).collect(Collectors.toList());
		
		// [{name=김땡땡, company=A company, age=23}, {name=이땡땡, company=B company, age=34}]
		System.out.println(distinctMapList.toString());

		
		/*
		 * 03. A키의 값이 조건에 참이면 해당 map의 B키 값들만 목록으로 뽑아내기.   
		 */
		List<String> overThirtyNameList = userInfoList.stream().filter(x -> (Integer)x.get("age") > 30).map(m -> m.get("name").toString()).collect(Collectors.toList());
		
		// [이땡땡, 박땡땡]
		System.out.println(overThirtyNameList.toString());
		
		
		/*
		 * 04. 특정 키를 기준으로 정렬
		 */
		Stream<HashMap<String, Object>> userInfoListStream = userInfoList.stream();
		List<HashMap<String, Object>> sortedUserInfoList = userInfoListStream.sorted((key1, key2)
																		-> key2.get("name").toString().compareTo(key1.get("name").toString())).collect(Collectors.toList());
																		// key2와 key1의 위치를 바꾸면 asc정렬.
		
		// [{name=이땡땡, company=B company, age=34}, {name=박땡땡, company=A company, age=31}, {name=김땡땡, company=A company, age=23}]
		System.out.println(sortedUserInfoList);
	}
	
	public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
		Set<Object> set = ConcurrentHashMap.newKeySet();
		return t -> set.add(keyExtractor.apply(t));
	}
	
	
}

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


/**
 * 연관된 정렬.
 * 회사명 오름차순으로 먼저 정렬한 뒤, 그 회사명으로 정렬된 내용 중에서 이름 오름차순으로 정렬.
 */
public class ListMapSort {

	public static void main(String[] args) {
		List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		list.add(getMember("이태민", "A Company", 5400));
		list.add(getMember("이진기", "A Company", 7200));
		list.add(getMember("김종현", "B Company", 64000));
		list.add(getMember("김기범", "B Company", 8200));
		list.add(getMember("최민호", "C Company", 9000));
		
		Stream<HashMap<String, Object>> stream = list.stream();
		List<HashMap<String, Object>> sortedList = stream.sorted(MapSortTest02::comparator).collect(Collectors.toList());
		for(int i = 0; i < sortedList.size(); i++) {
			System.out.println(sortedList.get(i));
		}
		
	}
	
	public static int comparator(HashMap<String, Object> map1, HashMap<String, Object> map2) {
		if(map1 == null && map2 == null) return 0;
		if(map1 == null || map2 == null) throw new NullPointerException();
		
		// 회사명 비교
		String company1 = (String) map1.get("company");
		String company2 = (String) map2.get("company");
		
		int companyCmp = company1.compareTo(company2);
		if(companyCmp != 0) return companyCmp;
		
		// 이름 비교
		String name1 = (String) map1.get("name");
		String name2 = (String) map2.get("name");
		
		int nameCmp = name1.compareTo(name2);
		if(nameCmp != 0) return nameCmp;
			
		return 0;
	}
	
	
	public static HashMap<String, Object> getMember(String name, String company, int salary) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("name", name);
		map.put("company", company);
		map.put("salary", salary);
		return map;
	}
	
}
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함