import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.junit.jupiter.api.Test;

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;

/**
* 工具类
*
* @author Stephen
* @since 2020/11/11
*/
public class CommonUtils {

/**
* list stream filter 按指定对象属性进行去重
*
* @param keyExtractor
* @param <T>
* @return
*/
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

@Test
public void test() {
List<Map> list = Lists.newArrayList();
Map map = Maps.newHashMap();
map.put("name", "name1");
map.put("code", "code1");
Map map1 = Maps.newHashMap();
map1.put("name", "name1");
map1.put("code", "code2");
list.add(map);
list.add(map1);
System.out.println("list.size() = " + list.size());// 2
//按指定map key进行去重
list = list.stream().filter(distinctByKey(b -> b.get("name"))).collect(Collectors.toList());
System.out.println("list.size() = " + list.size());// 1
}