根据Java 8中的属性从对象列表中删除重复项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了根据Java 8中的属性从对象列表中删除重复项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2354字,纯文字阅读大概需要4分钟。
内容图文
![根据Java 8中的属性从对象列表中删除重复项](/upload/InfoBanner/zyjiaocheng/715/09d84f975597413b8c94ebd2fc48e066.jpg)
参见英文答案 > Java 8 Distinct by property 22个
我试图基于某些属性从对象列表中删除重复项.
我们可以使用java 8以简单的方式完成它
List<Employee> employee
我们可以根据员工的id属性从中删除重复项.我已经看到帖子从字符串的arraylist中删除重复的字符串.
解决方法:
您可以从List获取流并将其放入TreeSet中,您可以从中提供自定义比较器,该比较器唯一地比较id.
然后,如果您确实需要一个列表,则可以将此集合放回到ArrayList中.
import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
...
List<Employee> unique = employee.stream()
.collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingInt(Employee::getId))),
ArrayList::new));
举个例子:
List<Employee> employee = Arrays.asList(new Employee(1, "John"), new Employee(1, "Bob"), new Employee(2, "Alice"));
它将输出:
[Employee{id=1, name='John'}, Employee{id=2, name='Alice'}]
另一个想法可能是使用包装员工的包装器,并使用基于其id的equals和hashcode方法:
class WrapperEmployee {
private Employee e;
public WrapperEmployee(Employee e) {
this.e = e;
}
public Employee unwrap() {
return this.e;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WrapperEmployee that = (WrapperEmployee) o;
return Objects.equals(e.getId(), that.e.getId());
}
@Override
public int hashCode() {
return Objects.hash(e.getId());
}
}
然后你包装每个实例,调用distinct(),解包它们并在列表中收集结果.
List<Employee> unique = employee.stream()
.map(WrapperEmployee::new)
.distinct()
.map(WrapperEmployee::unwrap)
.collect(Collectors.toList());
事实上,我认为你可以通过提供一个可以进行比较的函数来使这个包装器变得通用:
class Wrapper<T, U> {
private T t;
private Function<T, U> equalityFunction;
public Wrapper(T t, Function<T, U> equalityFunction) {
this.t = t;
this.equalityFunction = equalityFunction;
}
public T unwrap() {
return this.t;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@SuppressWarnings("unchecked")
Wrapper<T, U> that = (Wrapper<T, U>) o;
return Objects.equals(equalityFunction.apply(this.t), that.equalityFunction.apply(that.t));
}
@Override
public int hashCode() {
return Objects.hash(equalityFunction.apply(this.t));
}
}
并且映射将是:
.map(e -> new Wrapper<>(e, Employee::getId))
内容总结
以上是互联网集市为您收集整理的根据Java 8中的属性从对象列表中删除重复项全部内容,希望文章能够帮你解决根据Java 8中的属性从对象列表中删除重复项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。