Java(八):Stream流式操作-创新互联

介绍

Java8对集合操作功能的增强,专注于对集合的各种高效、便利、优雅的聚合操作。记录一下Stream流的一些用法。

创新互联建站主要从事网站建设、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务海门,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

获取list某个字段组装新List

ListuserIdList = userList.stream().map(e ->e.getUserId()).collect(Collectors.toList());

根据指定字段分组

Map>mapByName = list.stream().collect(Collectors.groupingBy(User::getName));

去重

ListnumList = Lists.newArrayList(1, 5, 3, 3, 6);
numList = numList.stream().distinct().collect(Collectors.toList());

// 根据指定字段去重
list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(User::getId))), ArrayList::new));

条件过滤 

// 只要包含有“张三”的数据
list = list.stream().filter(e ->e.getName().equals("张三")).collect(Collectors.toList());

求和

// 基本类型
int sumAge = userList.stream().mapToInt(User::getAge).sum();
// 其他  -- 若bigDecimal对象为null,可filter()过滤掉空指针
BigDecimal totalMemberNum = userList.stream().map(User::getMemberNum).reduce(BigDecimal.ZERO, BigDecimal::add);

大值/最小值

Date minDate = userList.stream().map(User::getCreateTime).min(Date::compareTo).get();
Date maxDate = userList.stream().map(User::getCreateTime).max(Date::compareTo).get();
User maxUp = userList.stream().max(Comparator.comparingInt(User::getAge)).get();

差值(新增/删除)

ListuserIdListNew = Lists.newArrayList(1, 2, 3, 5, 6);
ListuserIdListOld = Lists.newArrayList(1, 2, 3, 4);

// 删除人员 [4]
ListremoveUserIdList = userIdListOld.stream().filter(userIdOld ->!userIdListNew.contains(userIdOld)).collect(Collectors.toList());

// 新增人员 [5, 6]
ListaddUserIdList = userIdListNew.stream().filter(userIdNew ->!userIdListOld.contains(userIdNew)).collect(Collectors.toList());

分类统计数量

// 多字段统计 -- ex: 统计相同name下相同age的个数
Map>map = list.stream().collect(
                Collectors.groupingBy(User::getName, Collectors.groupingBy(User::getAge, Collectors.counting()))
        );

// 单字段统计 [LongSummaryStatistics中包含总数、最小值、大值、平均值等信息]   --  ex: 根据名称去统计
Mapmap = list.stream()
        .collect(
                Collectors.groupingBy(User::getName, Collectors.summarizingLong(User::getAge))
        );

求list重复元素值

@Test
public void test02() throws Exception {
    Listlist = Lists.newArrayList(1, 2, 3, 4, 5, 6, 1, 6, 6);
    ListrepeatDataList = list.stream()
        .collect(Collectors.toMap(e ->e, e ->1, Integer::sum))
        .entrySet().stream()
        .filter(entry ->entry.getValue() >1)
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
    System.out.println(repeatDataList); // [1, 6]
    
    
    // 求list对象中某一个字段的重复值
    ListrepeatValueDataList = dictList
                    .stream().map(e ->e.getValue()).collect(Collectors.toList())
                    .stream().collect(Collectors.toMap(e ->e, e ->1, Integer::sum))
                    .entrySet().stream()
                    .filter(entry ->entry.getValue() >1)
                    .map(Map.Entry::getKey)
                    .collect(Collectors.toList());
}

publicListgetRepeatDataList(Listlist) {
    return list.stream()
            // 获得元素出现频率的 Map,键为元素,值为元素出现的次数
            .collect(Collectors.toMap(e ->e, e ->1, Integer::sum))
            // Set转换为Stream.entrySet().stream()
            // 过滤出元素出现次数大于 1 的 entry
            .filter(entry ->entry.getValue() >1)
            // 获得 entry 的键(重复元素)对应的 Stream
            .map(Entry::getKey)
            // 转化为 List
            .collect(Collectors.toList());
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:Java(八):Stream流式操作-创新互联
浏览路径:http://scyanting.com/article/pohji.html