前言
对于list集合进行去重操作,多种情况进行记录.
只记录在学习与实践过程中需要对集合操作的场景,方便下次能够直接快速的回忆起来.
当然这些方法的使用与操作皆是对于Java8
的stream操作
,TreeSet不重复特性
进行的运用.
如果能够更好更快的达成目的,也是不必拘泥于某一些固定的方式去处理数据,以效率与程序开销优先.
正文
数据对象
将数据对象写成静态不可变的list
来方便我们对于程序进行调用验证
private static final List<SyncBalance> list = asList(
new SyncBalance(BigDecimal.ZERO, "12345678", 0, 1, "GGBond", 32, 0),
new SyncBalance(BigDecimal.ZERO, "22345678", 0, 1, "GGBond", 32, 0),
new SyncBalance(BigDecimal.ZERO, "22345678", 1, 1, "GGBond", 32, 0),
new SyncBalance(BigDecimal.ZERO, "22345678", 1, 1, "GGBond", 32, 0)
);
1. 对象整体去重
/**
* 1. 对所有属性一样的数据进行去重
*/
public static void allColumnDistinct() {
List<SyncBalance> allColumnDistinct = list.stream().distinct().collect(Collectors.toList());
}
2. 单个属性去重(只返回属性)
/**
* 2. 对单个属性去重,只返回去重的属性
*/
public static void columnDistinct() {
List<String> columnDistinct = list.stream().map(SyncBalance::getMobile).distinct().collect(Collectors.toList());
}
3. 单个属性去重
/**
* 3-1. 对单个属性一样的数据进行去重,下面是对`mobile`去重
*/
public static void oneColumnDistinctMethodOne() {
List<SyncBalance> oneColumnDistinctMethodOne = list.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(SyncBalance::getMobile))), ArrayList::new));
}
/**
* 3-2. 对单个属性一样的数据进行去重,下面是对`mobile`去重(通过自定义属性去重方法)
*/
public static void oneColumnDistinctMethodTwo() {
List<SyncBalance> oneColumnDistinctMethodTwo = list.stream().filter(distinctByKey(i -> i.getMobile())).collect(Collectors.toList());
}
/**
* list对象单个个字段去重(自定义属性)
* @param keyExtractor 去重的对象字段
* @return
* @param <T>
*/
public 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;
}
/**
* 3-3. 对单个属性一样的数据进行去重,下面是对`mobile`去重
* 利用TreeSet进行去重
*/
public static void oneColumnDistinctMethodThree() {
TreeSet<SyncBalance> oneColumnDistinctMethodThree = new TreeSet<>(Comparator.comparing(i -> i.getMobile()));
list.forEach(a -> oneColumnDistinctMethodThree.add(a));
}
4. 多个属性去重
/**
* 4. 多个字段条件去重
*/
public static void twoColumnDistinct() {
List<SyncBalance> twoColumnDistinct = list.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(p -> p.getMobile() + ";" + p.getStatus()))), ArrayList::new));
}
验证方法
对于验证方法添加了一些分隔的数据
/**
* 验证的main方法
* @param args
*/
public static void main(String[] args) {
allColumnDistinct();
columnDistinct();
oneColumnDistinctMethodOne();
oneColumnDistinctMethodTwo();
oneColumnDistinctMethodThree();
twoColumnDistinct();
}
运行结果
allColumnDistinct---v
SyncBalance(accountBalance=0, mobile=12345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=1, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
allColumnDistinct---^
columnDistinct---v
12345678
22345678
columnDistinct---^
oneColumnDistinctMethodOne---v
SyncBalance(accountBalance=0, mobile=12345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
oneColumnDistinctMethodOne---^
oneColumnDistinctMethodTwo---v
SyncBalance(accountBalance=0, mobile=12345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
oneColumnDistinctMethodTwo---^
oneColumnDistinctMethodThree---v
SyncBalance(accountBalance=0, mobile=12345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
oneColumnDistinctMethodThree---^
twoColumnDistinct---v
SyncBalance(accountBalance=0, mobile=12345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=0, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
SyncBalance(accountBalance=0, mobile=22345678, status=1, sysId=1, loginAccountName=GGBond, keepOrUpdate=32, id=0)
twoColumnDistinct---^
结尾
集合的操作不止拘泥于stream流
与TreeSet
可以处理,其他一下如果可以实现皆可使用.
以上,皆可直接使用.