计算list中某一字段和
XXlist.stream().collect(Collectors.summingInt(XXDO::getXX));
计算一个number类型的List对象总和
Integer[] integerArray = {1, 3, 5, 10, 18};
List<Integer> list = new ArrayList<>(Arrays.asList(integerArray));
IntSummaryStatistics summaryStatistics = list.stream().mapToInt((s) -> s).summaryStatistics();
System.out.println("总和:" + summaryStatistics.getSum());
System.out.println("平均数:" + summaryStatistics.getAverage());
System.out.println("总个数:" + summaryStatistics.getCount());
System.out.println("最大值:" + summaryStatistics.getMax());
System.out.println("最小值:" + summaryStatistics.getMin());
取字段转list
distinct 去重
List<Long> bussinessIdList = v.stream().map(AppUserCollectionDo::getCollectionBussinessId).distinct().collect(Collectors.toList());
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
//根据id去重
List<User> unique1 = list.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(comparing(User::getId))), ArrayList::new));
System.out.println(unique1);
//根据id和mobile去重
List<User> unique2 = list.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(comparing(o -> o.getId() + ";" + o.getMobile()))), ArrayList::new)
);
根据字段分类
//按属性
Map<Long, List<ImsAchievementMonthlyDo>> monthlyMap = monthlyDos.stream().collect(Collectors.groupingBy(ImsAchievementMonthlyDo::getSchedulingId));
//按天
Map<String, List<CmsRoomSiteDo>> online = cmsRoomSiteDos.stream().collect(Collectors.groupingBy(item -> DateUtil.format(item.getCreateTime(), "yyyy-MM-dd")));
//按小时
Map<String, List<CmsRoomSiteDo>> starLive = cmsRoomSiteDos.stream().collect(Collectors.groupingBy(item -> DateUtil.format(item.getCreateTime(), "HH:00:00")));
//按时长
Map<Long, List<CmsRoomSiteDo>> liveTime = cmsRoomSiteDos.stream().collect(Collectors.groupingBy(item -> item.getDurationTime()/3600));
for (Map.Entry<Long, List<CmsRoomSiteDo>> entry : liveTime .entrySet()) {
System.out.println("key = " + entry.getKey() +"--value = " + entry.getValue());
}
根据字段转 map
Map<Long, CompanyVo> groupDoMap = companyList.stream()
.collect(Collectors.toMap(CompanyVo::getCompanyCode, CompanyVo->CompanyVo));
Map<Long, Integer> projectMap = projects.stream()
.collect(Collectors.toMap(Project::getId, Project::getScaleType));
//两个字段合起来做key
Map<String, PublicInstitutionAwardEntity> awardMap = publicInstitutionAwardEntities.stream().collect(Collectors.toMap(
new Function<PublicInstitutionAwardEntity, String>() {
@Override
public String apply(PublicInstitutionAwardEntity award) {
return award.getEvaluateTime() + "" + award.getMonitoringId();
}
},
PublicInstitutionAwardEntity -> PublicInstitutionAwardEntity));
取字段计算和
filter 过滤
double payAmountSum = achievementDailyDos.stream()
.filter(d -> d.getPayAmount() != null)
.mapToDouble(ImsAchievementDailyDo::getPayAmount).sum();
stream流计算BigDecimal字段和
BigDecimal carbonReduceSum = projectYearDatas.stream()
// 将ProjectYearData对象的carbonReduce取出来map为Bigdecimal
.map(ProjectYearData::getCarbonReduce)
// 使用reduce聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
List用stream流把List里的值都变成key value变成新对象
List<String> list;
Map<String, Object> map =
list.stream()
.collect(Collectors.toMap(Function.identity(), s -> new Object()));
查找list中特定元素所在下标
1.findFirst
2.findAny
findFirst和findAny如何选择?
如果你不关心返回的是哪一个数据,只要符合条件的就行,那就用findAny。
而且在并行流上,findAny限制更少。
如果你关心集合的顺序,要返回符合条件的第一个元素,那就用findFirst。
原子性自增
getAndIncrement
方法是返回旧值(即加1前的原始值),而
incrementAndGet
返回的是新值(即加1后的值)
AtomicInteger index = new AtomicInteger(0);
//查找机构所在排名
ranking100.stream()
//指定匹配逻辑
.filter(in -> {
//每比对一个元素,数值加1
index.getAndIncrement();
return in.getInstitutionId().equals(user.getInsId());
})
.findFirst();
排序 列表list排名取前100名(正序去掉reversed())
collect.stream().sorted(Comparator.comparing(InstitutionRankingVO::getResourceCount).reversed()).limit(100).collect(Collectors.toList())