Stream流使用

计算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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值