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
    }