Java开发中集合 Stream常用操作总结

1. List 转成 新List

// 查询到一个实体列表,转成一个定制的VO列表
List<RiskIdentifyLibEntity> libList = ....
List<DangerTypeTreeVo> collect = dangerTypeEntityList.stream().map(d -> {
    DangerTypeTreeVo dangerTypeTreeVo = new DangerTypeTreeVo();
    BeanUtils.copyProperties(d, dangerTypeTreeVo);
    return dangerTypeTreeVo;
}).collect(Collectors.toList());
// 提取实体列表某字段列表
List<String> stationList = usersEntityList.stream().map(UsersEntity::getStationId).collect(Collectors.toList());
List<String> guideNames = guideList.stream().map(DangerCheckGuideEntity::getGuideName).collect(Collectors.toList());
// 筛选员工中工资高于8000的人,并形成新的集合。
List<String> fiterList = personList.stream().filter(x -> x.getSalary() > 8000).map(Person::getName)
    .collect(Collectors.toList());

2. 过滤筛选

// 过滤id为空的结果
libList =  libList.stream().filter(o -> StringUtils.isNotBlank(o.getId())).collect(Collectors.toList());

List<String> permission=permissionTree.stream().map(Ztree::getType).filter(string -> StrUtil.isNotEmpty(string)).collect(Collectors.toList());
// 去重
deleteList = deleteList.stream().distinct().collect(Collectors.toList());

3. List 转 Map

按某字段分组(按条件、求和等结合)

/**
*  按 (key : 名字) 构建map
*  key必须是唯一的,不然会报错 Java.lang.IllegalStateException:Duplicate key
*  要在toMap方法中指定当key冲突时key的选择。 Function.identity(), (key1, key2) -> key2 (这里是选择第二个key覆盖第一个key)
*/
Map<String, String> userMap = usersList.stream().collect(Collectors.toMap(UsersEntity::getId, UsersEntity::getUserName));


// 这里是选择第一个key覆盖第二个key
Map<String, TreeVO> treeMap = list.stream().collect(Collectors.toMap(TreeVO::getId, a -> a, (k1, k2) -> k1));

// List<实体> ---> Map<实体id,实体> (id需唯一)
Map<String, DangerCheckRecordEntity> recordsMap = recordEntities.stream().collect(Collectors.toMap(DangerCheckRecordEntity::getOperatorId,
                        DangerCheckRecordEntity -> DangerCheckRecordEntity));

// 检查记录按 (taskId : 数量) 构建map
Map<String, Long> map = records.stream().collect(Collectors.groupingBy(DangerCheckRecordEntity::getTaskId, Collectors.counting()));

// 将员工按薪资是否高于8000分组
Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));

// 将员工按性别分组
Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));


Map再嵌套Map

// 返回 Map<String, Map<Integer, Person>>
Map<String, Map<Integer, Person>> collect = personList.stream().collect(Collectors.toMap(Person::getName, p -> {
            Map<Integer, Person> map = new HashMap<>();
            map.put(p.getAge(), p);
            return map;
        }));

// 将员工先按性别分组,再按地区分组
Map<String, Map<String, List<Person>>> group2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));


// 多级分组
Map<String, Map<String, List<Product>>> prodMap= prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {
	if(item.getNum() < 3) {
		return "3";
	}else {
		return "other";
	}
})));
//结果:{"啤酒":{"other":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}]},"零食":{"other":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30}],"3":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}}

4. 统计

// 已启用的数据量
long enableCount = list.stream().filter(o -> o.getHasStatus() == 0).count();

// 已锁定的数据量
long lockCount = list.stream().filter(o -> o.getHasStatus() == 2).count();

 // 求总数
Long count = personList.stream().collect(Collectors.counting());

// 求总数
Integer count = hiddenItemStandardCounts.stream().mapToInt(item -> item).sum();

// 求工资之和方式1:
Integer sumSalary1 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), (sum1, sum2) -> sum1 + sum2);

// 求工资之和方式2:
Integer sumSalary2 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), Integer::sum);

// 求工资之和3
Integer sumSalary3 = personList.stream().collect(Collectors.summingInt(Person::getSalary));

// 求平均工资
Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));

// 求最高工资
Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));

// 一次性统计所有信息
// 结果示例:DoubleSummaryStatistics{count=3, sum=23700.000000,min=7000.000000, average=7900.000000, max=8900.000000}
DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));

5. 排序

//由于hashmap无序,所以在排序放入LinkedHashMap里(key升序)
Map<String, Long> sortMap = new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.comparingByKey()).
    forEachOrdered(e -> sortMap.put(e.getKey(), e.getValue()));
System.out.println(sortMap);

//获取排序后map的key集合
List<String> keys = new LinkedList<>();
sortMap.entrySet().stream().forEachOrdered(e -> keys.add(e.getKey()));
System.out.println(keys);

//获取排序后map的value集合
List<Long> values = new LinkedList<>();
sortMap.entrySet().stream().forEachOrdered(e -> values.add(e.getValue()));
System.out.println(values);

完整示例

public class StreamTest {
 public static void main(String[] args) {
  List<Person> personList = new ArrayList<Person>();
 
  personList.add(new Person("Sherry", 9000, 24, "female", "New York"));
  personList.add(new Person("Tom", 8900, 22, "male", "Washington"));
  personList.add(new Person("Jack", 9000, 25, "male", "Washington"));
  personList.add(new Person("Lily", 8800, 26, "male", "New York"));
  personList.add(new Person("Alisa", 9000, 26, "female", "New York"));
 
  // 按工资增序排序
  List<String> newList = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName)
    .collect(Collectors.toList());
  // 按工资倒序排序
  List<String> newList2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
    .map(Person::getName).collect(Collectors.toList());
  // 先按工资再按年龄自然排序(从小到大)
  List<String> newList3 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
    .map(Person::getName).collect(Collectors.toList());
  // 先按工资再按年龄自定义排序(从大到小)
  List<String> newList4 = personList.stream().sorted((p1, p2) -> {
   if (p1.getSalary() == p2.getSalary()) {
    return p2.getAge() - p1.getAge();
   } else {
    return p2.getSalary() - p1.getSalary();
   }
  }).map(Person::getName).collect(Collectors.toList());
 
  System.out.println("按工资自然排序:" + newList);
  System.out.println("按工资降序排序:" + newList2);
  System.out.println("先按工资再按年龄自然排序:" + newList3);
  System.out.println("先按工资再按年龄自定义降序排序:" + newList4);
 }
}

结果:
按工资自然排序:[Lily, Tom, Sherry, Jack, Alisa]
按工资降序排序:[Sherry, Jack, Alisa,Tom, Lily]
先按工资再按年龄自然排序:[Sherry, Jack, Alisa, Tom, Lily]
先按工资再按年龄自定义降序排序:[Alisa, Jack, Sherry, Tom, Lily]

6. 字符拼接

public class StreamTest {
 public static void main(String[] args) {
  List<Person> personList = new ArrayList<Person>();
  personList.add(new Person("Tom", 8900, 23, "male", "New York"));
  personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
  personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
 
  String names = personList.stream().map(p -> p.getName()).collect(Collectors.joining(","));
  System.out.println("所有员工的姓名:" + names);
  List<String> list = Arrays.asList("A", "B", "C");
  String string = list.stream().collect(Collectors.joining("-"));
  System.out.println("拼接后的字符串:" + string);
 }
}

结果:
所有员工的姓名:Tom,Jack,Lily
拼接后的字符串:A-B-C
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值