package com.test.sample;

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

public class StreamTest {
	
	final static int FETCH_MAX_SIZE = 2;
	
	public static void main (String[] args) {
		
		List<Map<String, Object>> prdList = new ArrayList<Map<String, Object>>();
		List<Map<String, Object>> prdList2 = new ArrayList<Map<String, Object>>();
		for (int i=0; i < 10; i++) {
			Map<String, Object> product = new HashMap<>();
			product.put("prdNo", i + 1000);
			product.put("ordQty", i + 30);
			
			if (i%2 == 0) {
				product.put("useYn", "N");
			}
			else  {
				product.put("useYn", "Y");
			}
			prdList.add(product);
		}
		
		System.out.printf("\n\n");
		System.out.printf("prdList:" + prdList);

		prdList2 = 
		prdList.stream().filter(distinctByPrdNo(m -> m.get("prdNo")))
		.filter(t->t.get("useYn").equals("Y"))
		.limit(FETCH_MAX_SIZE).collect(Collectors.toList());

		System.out.printf("\n\n");
		System.out.printf("prdList:" + prdList);

		System.out.printf("\n\n");
		System.out.printf("prdList2:" + prdList2);

	}
	
	private static <T> Predicate<T> distinctByPrdNo(Function<? super T, ?> keyExtractor) {
		Set<Object> seen = ConcurrentHashMap.newKeySet();
		return t -> seen.add(keyExtractor.apply(t));
	}
}