java8实现列表去重,java8的stream 和lambda
2018-03-26 本文已影响859人
编程小石头666
不管我们做安卓开发还是javaweb开发,有时候我们会对列表进行去重操作,所谓的列表数据重复,通常体现在列表集合数据中的id属性相同。当然我们通过普通的方式也可以达到去重的效果。但是借助java8新特性可以很方便的实现列表去重,下面就写个小demo简单的演示一下。
主要实现代码
List<Person> persons = new ArrayList();
List<Integer> ids = new ArrayList<>();//用来临时存储person的id
persons.add(new Person(1, "name1", 10));
persons.add(new Person(2, "name2", 21));
persons.add(new Person(5, "name5", 55));
persons.add(new Person(3, "name3", 34));
persons.add(new Person(1, "name1", 10));
List<Person> personList = persons.stream().filter(// 过滤去重
v -> {
boolean flag = !ids.contains(v.getId());
ids.add(v.getId());
return flag;
}
).collect(Collectors.toList());
System.out.println(personList);
运行后的打印如下.可以看出id为1时的重复数据已经被过滤掉了
[
Person{id=1, name='name1', age=10},
Person{id=2, name='name2', age=21},
Person{id=5, name='name5', age=55},
Person{id=3, name='name3', age=34}
]
person类的代码如下
package com.qcl.demo;
/**
* Created by qcl on 2018/3/26.
*/
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(int id, String name, int age) {
this.id = id;
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;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
这只是java8在我们开发时比较常用的一个操作。
如下面这个例子使用也比较普遍
获取person集合中的所有大于18周岁,并排序
List<Person> persons = new ArrayList();
persons.add(new Person(1, "name1", 10));
persons.add(new Person(2, "name2", 21));
persons.add(new Person(5, "name5", 55));
persons.add(new Person(3, "name3", 34));
persons.add(new Person(4, "name4", 6));
persons.stream()
.filter(p -> p.getAge() >= 18)//获取所有18岁以上的用户
.sorted(Comparator.comparing(Person::getAge))//依年纪升序排序
.sorted(Comparator.comparing(Person::getAge).reversed())//依年纪降序排序
.collect(Collectors.toList())
.forEach(System.out::println);
boolean isAllAdult = persons.stream().
allMatch(p -> p.getAge() > 18);
System.out.println("是否所有的用户都大于18岁" + isAllAdult);
总结:java8的使用,对于我们操作集合,数组提供了很大的便利。建议大家有机会多去了解下java8的新特性。