1、求取两个不同list对象之间的差集(根据某一个字段)<效率高>
结果是 List obj1 去掉 obj2的结果集
public List<Object1> getSuKdgDifference(List<Object1> obj1, List<Object2> obj2) {
List<Object1> difference = new ArrayList<>();
Map<String, String> map = new HashMap<>();
obj2.forEach(a -> {
map.put(a.getUserCode(), a.getUserCode());
});
obj1.forEach(b -> {
if (StringUtils.isEmpty(map.get(b.getAccount()))) {
difference.add(b);
}
});
return difference;
}
2、求取两个不同list对象之间的交集(根据某一个字段)<效率高>
结果是 obj1 和 obj2 共同拥有的结果集
public List<Object1> getSuKdgDifference(List<Object1> obj1, List<Object2> obj2) {
List<Object1> difference = new ArrayList<>();
Map<String, String> map = new HashMap<>();
obj2.forEach(a -> {
map.put(a.getUserCode(), a.getUserCode());
});
obj1.forEach(b -> {
if (!StringUtils.isEmpty(map.get(b.getAccount()))) { //不同点 非(!)
difference.add(b);
}
});
return difference;
}
3、list转map
Map<Integer, String> result1 = list.stream().collect(
Collectors.toMap(Hosting::getId, Hosting::getName));
Map<Long, User> maps = userList.stream().collect(Collectors.toMap(User::getId,Function.identity()));
// 转换成map的时候,可能出现key一样的情况,如果不指定一个覆盖规则,上面的代码是会报错的。转成map的时候,最好使用下面的方式
Map<Long, User> maps = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));
4、map转list
map.entrySet().stream().map(e -> new Person(e.getKey(),e.getValue())).collect(Collectors.toList());
map.keySet().stream().collect(Collectors.toList());
map.values().stream().collect(Collectors.toList());
5、获取list中所有对象的某个属性
List<String> list= cities.stream().map(City :: getCity).collect(Collectors.toList());
List<String> list= cities.stream().map(o->o.getCity()).collect(Collectors.toList());
6、根据对象的多个字段分组,并求和
Map<String, RpCwBranchMid> rpCwBranchMidMap = rpCwBranchMids.stream().
collect(Collectors.groupingBy(o -> String.join("@", o.getBranchId(), o.getBranchName(), o.getProjectId(), o.getProjectName(), DateUtils.turnDateToString(o.getEnterTime(), DateUtils.dateTimeFormatYMD))
, Collectors.collectingAndThen(Collectors.toList(), m -> {
RpCwBranchMid rpCwBranchMid = new RpCwBranchMid();
BeanUtils.copyProperties(m.get(0), rpCwBranchMid);
Long reCallNum1 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getReCallNum1).sum();
Long reCallNum2 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getReCallNum2).sum();
Long reCallNum3 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getReCallNum3).sum();
Long noCallNum1 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getNoCallNum1).sum();
Long noCallNum2 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getNoCallNum2).sum();
Long noCallNum3 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getNoCallNum3).sum();
Long callNum = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getCallNum).sum();
rpCwBranchMid.setReCallNum1(reCallNum1);
rpCwBranchMid.setReCallNum2(reCallNum2);
rpCwBranchMid.setReCallNum3(reCallNum3);
rpCwBranchMid.setNoCallNum1(noCallNum1);
rpCwBranchMid.setNoCallNum2(noCallNum2);
rpCwBranchMid.setNoCallNum3(noCallNum3);
rpCwBranchMid.setNoCallNum3(callNum);
return rpCwBranchMid;
})
));
Long类型的求和:
Long reCallNum1 = m.stream().filter(Objects::nonNull).mapToLong(RpCwBranchMid::getReCallNum1).sum();
BigDecimal类型求和后相除:
BigDecimal e = m.parallelStream().map(EmploymentBudgetDto::getE).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(siteList.size()), 1, RoundingMode.HALF_UP);