/**  
* <p>Title: CheckUtil.java</p>  
* <p>Description: </p>  
* @author dsc  
* @date 2020年5月21日  
* @version 1.0  
*/
package cn.timer.api.utils;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * <p>
 * Title: CheckUtil.java
 * </p>
 * <p>
 * Description: 判断对象是否包含空值
 * </p>
 * 
 * @author dsc
 * @date 2020年5月21日
 * @version 1.0
 */
public class CheckUtil {

	/**
	 * 检查对象是否有空字段
	 * 
	 * @param obj 实体对象
	 * @return 有则返回true
	 */
	public static <T> boolean checkObjFieldIsNull(T obj) {
		boolean flag = false;
		for (Field f : obj.getClass().getDeclaredFields()) {
			f.setAccessible(true);
			try {
				if (f.get(obj) == null) {
					flag = true;
					return flag;
				}
			} catch (IllegalArgumentException | IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return flag;
	}

	/**
	 * 交集
	 * 
	 * @param <T>
	 * @param list1
	 * @param list2
	 * @return list1与list2中相同的字段list
	 */
	public static <T> List<T> intersection(List<T> list1, List<T> list2) {
		return list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
	}

	/**
	 * 列表取差集
	 * 
	 * @param <T>
	 * @param list1
	 * @param list2
	 * @return list2中未包含list1的参数list
	 */
	public static <T> List<T> reduce(List<T> list1, List<T> list2) {
		return list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
	}

	/**
	 * 并集
	 * 
	 * @param <T>
	 * @param list1
	 * @param list2
	 * @param isDistinct 是否去重
	 * @return
	 */
	public static <T> List<T> distinct(List<T> list1, List<T> list2, boolean isDistinct) {
		list1.addAll(list2);
		if (!isDistinct)
			return list1;
		return list1.stream().distinct().collect(Collectors.toList());
	}
	
	/**
	 * 字段条件去重
	 * @param <T>
	 * @param keyExtractor
	 * @return
	 */
	public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
		Map<Object, Boolean> seen = new ConcurrentHashMap<>();
		return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
	}

//	public static void main(String[] args) {
//		List<String> list1 = new ArrayList<String>();
//		list1.add("a");
//		list1.add("b");
//		list1.add("c");
//		list1.add("d");
//		list1.add("3");
//		List<String> list2 = new ArrayList<String>();
//		list2.add("a");
//		list2.add("b");
//		list2.add("e");
//		list2.add("3");
//		System.err.println(intersection(list1, list2));
//		System.err.println(reduce(list1, list2));
//		System.err.println(distinct(list1, list2, false));
//	}

}