import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import lombok.Data;
/**
* @author xfyou
*/
public class Test {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
Person p1 = new Person();
p1.setName("Frank");
personList.add(p1);
Person p2 = new Person();
p2.setName("Frank");
personList.add(p2);
Person p3 = new Person();
p3.setName("Tom");
personList.add(p3);
personList.stream().filter(distinctByKey(Person::getName)).forEach(c -> System.out.println(c.getName()));
}
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
// 这个局部变量必须定义,这个局部变量将会成为下面生成的局部匿名内部类的一个字段(field)
final Set<Object> seen = ConcurrentHashMap.newKeySet();
// 用 lambda 来代替匿名内部类
return t -> seen.add(keyExtractor.apply(t));
}
@Data
public static class Person {
private String name;
}
}