企业官网用什么cms系统关键词优化一年多少钱
文章目录
- 前言
- 正文
- 数据对象
- 1. 对象整体去重
- 2. 单个属性去重(只返回属性)
- 3. 单个属性去重
- 4. 多个属性去重
- 验证方法
- 运行结果
- 结尾
前言
对于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
可以处理,其他一下如果可以实现皆可使用.
以上,皆可直接使用.