- /* package whatever; // don't place package name! */ 
-   
- import java.util.Arrays; 
- import java.util.List; 
- import java.util.Map; 
- import java.util.concurrent.ConcurrentHashMap; 
- import java.util.function.Function; 
- import java.util.function.Predicate; 
- import static java.util.stream.Collectors.toList; 
-   
- /* Name of the class has to be "Main" only if the class is public. */ 
- class Ideone 
- { 
-   
-     public static void-  main (String[]-  args ) {
 
-         List <- Person >-  listPersons  = Arrays- . asList(
-                 new Person(1, "person1"), 
-                 new Person(1, "person5"), 
-                 new Person(2, "person2"), 
-                 new Person(1, "person1"), 
-                 new Person(1, "person2"), 
-                 new Person(1, "person1"), 
-                 new Person(3, "person3") 
-         ); 
-         List<Person> persons = listPersons.stream() 
-                 .filter(distinctByKey(pr -> pr.getId() + " " + pr.getName())) 
-                 .collect(toList()); 
-   
-         persons. forEach(System- . out::- println );
-     } 
-   
-     private 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;
 
-     } 
-   
- } 
-   
- class Person { 
-   
-     private int id; 
-   
-     public Person() { 
-     } 
-   
-     public int getId() { 
-         return id; 
-     } 
-   
-     public-  Person (int-  id,  String-  name ) {
 
-         this.id = id; 
-         this.name = name; 
-     } 
-   
-         return name; 
-     } 
-   
-     public void-  setName (String-  name ) {
 
-         this.name = name; 
-     } 
-   
-     @Override 
-         return "Person{" + "id=" + id + ", name=" + name + '}'; 
-     } 
-   
- } 
				LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CmltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBMaXN0PFBlcnNvbj4gbGlzdFBlcnNvbnMgPSBBcnJheXMuYXNMaXN0KAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigxLCAicGVyc29uMSIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigxLCAicGVyc29uNSIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigyLCAicGVyc29uMiIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigxLCAicGVyc29uMSIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigxLCAicGVyc29uMiIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigxLCAicGVyc29uMSIpLAogICAgICAgICAgICAgICAgbmV3IFBlcnNvbigzLCAicGVyc29uMyIpCiAgICAgICAgKTsKICAgICAgICBMaXN0PFBlcnNvbj4gcGVyc29ucyA9IGxpc3RQZXJzb25zLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAuZmlsdGVyKGRpc3RpbmN0QnlLZXkocHIgLT4gcHIuZ2V0SWQoKSArICIgIiArIHByLmdldE5hbWUoKSkpCiAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0xpc3QoKSk7CgogICAgICAgIHBlcnNvbnMuZm9yRWFjaChTeXN0ZW0ub3V0OjpwcmludGxuKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyA8VD4gUHJlZGljYXRlPFQ+IGRpc3RpbmN0QnlLZXkoRnVuY3Rpb248PyBzdXBlciBULCA/PiBrZXlFeHRyYWN0b3IpIHsKICAgICAgICBNYXA8T2JqZWN0LCBCb29sZWFuPiBzZWVuID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKICAgICAgICByZXR1cm4gdCAtPiBzZWVuLnB1dElmQWJzZW50KGtleUV4dHJhY3Rvci5hcHBseSh0KSwgQm9vbGVhbi5UUlVFKSA9PSBudWxsOwogICAgfQoKfQoKY2xhc3MgUGVyc29uIHsKCiAgICBwcml2YXRlIGludCBpZDsKICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CgogICAgcHVibGljIFBlcnNvbigpIHsKICAgIH0KCiAgICBwdWJsaWMgaW50IGdldElkKCkgewogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBwdWJsaWMgUGVyc29uKGludCBpZCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiAiUGVyc29ueyIgKyAiaWQ9IiArIGlkICsgIiwgbmFtZT0iICsgbmFtZSArICd9JzsKICAgIH0KCn0=