直接上代碼:(實現(xiàn)了去重加排序的效果)
//換行只是為了方便看
userList.stream().collect(Collectors.collectingAndThen(Collectors
.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getAge))), ArrayList::new));
comparing(比較器)定義的就是去重的所使用的字段,可以使用匿名內(nèi)部類來寫更復(fù)雜的去重邏輯。
我們看看單參數(shù)的比較器方法實現(xiàn);如下,可以發(fā)現(xiàn)內(nèi)部實際調(diào)用效果類似于(a,b)->a.getXXX.conpareTo(b.getXXX)。
因為Function.apply(field)實際上是獲取當(dāng)前對象的field字段的值。
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
實際的去重是通過TreeSet來實現(xiàn)的,外部的其他操作本質(zhì)上是遍歷傳參,創(chuàng)建TreeSet并指定比較器,最后收集結(jié)果集。
驗證可用性:
import java.util.*;
import java.util.stream.Collectors;
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
User user=new User("藏三",18);
User user1=new User("藏三1",19);
User user2=new User("藏三2",28);
User user3=new User("藏三3",29);
User user4=new User("藏三4",18);
User user5=new User("藏三5",38);
User user6=new User("藏三6",48);
List<User> userList=new ArrayList<>();
userList.add(user);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.stream().forEach(System.out::println);
ArrayList<User> collect = userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getAge))), ArrayList::new));
// //按照每十年一個年齡段,在各個年齡段里面要一個人
// ArrayList<User> collect = userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o->{
// return o.getAge()/10;
// }))), ArrayList::new));
System.out.println("--------------------------");
collect.stream().forEach(System.out::println);
}
}
結(jié)果:(藏三4因為年齡和第一個一樣,就被過濾掉了,并且數(shù)據(jù)也按照age進行了排序,升序)
注解掉代碼的執(zhí)行結(jié)果:(符合去重邏輯,每個年齡段只有一個人)文章來源:http://www.zghlxwxcb.cn/news/detail-666120.html
另外,HashSet不太適合用來做自定義去重,因為HashSet的去重是通過類的equals和hashCode方法實現(xiàn)的。文章來源地址http://www.zghlxwxcb.cn/news/detail-666120.html
到了這里,關(guān)于jdk8對象列表使用stream流基于某個字段(或某些條件)實現(xiàn)去重的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!