/* 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=