Java开发:列表List的流操作

一、示例数据

  1、类结构

字段名称 字段类型 字段备注
id Integer 唯一标识
score Double 分数
money BigDecimal 奖金

  2、列表初始化数据

  

id score money
1 96.0 5000
2 84.5 4000
3 70.0 3000
4 74.0 3000
5 82.0 4000

二、流操作

  1、求和

  int、double、long类型求和(哪种类型的就将mapTo方法更换为对应的类型,括号里为类里要求和的数据列,后缀是sum方法):

Double d = list.stream().mapToDouble(TestClass :: getScore).sum();

  BigDecimal类型求和:

BigDecimal b = list.stream().map(TestClass::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);

  2、筛选

  筛选单个:

TestClass testClassFindOne = list.stream().filter(testClass -> testClass.score == 70.0).findAny().orElse(null);

  筛选多个:

List<TestClass> testClassFindManyList = list.stream().filter(testClass -> testClass.score > 80.0).collect(Collectors.toList());

  筛选的时候都是使用filter方法,区别在于条件不同,单个属性通过不同的判断条件来判断是否符合筛选条件。

  查单个时是使用精准匹配的条件,且使用findAny()在列表中提取出符合条件的元素,附加条件orElse(null)表示的是如果没有查到符合条件的元素时,则返回空。

  查多个时往往是使用范围性的条件,如大于小于或者存在重复数据时进行匹配,查询完之后通过collect(Collectors.toList())进行组合,返回的是一个包含符合条件元素的列表,无符合条件的元素时为空列表。

  3、遍历

list.stream().forEach(testClass -> {
      xxxxxx();
});

  遍历使用foreach方法,对列表中的每个元素执行操作。

  4、统计

Long count = list.stream().filter(testClass -> testClass.score > 80).count();

  统计使用count()方法进行计数并返回。

  5、分组

Map<Integer,List<TestClass>> testClassGroupList = list.stream().collect(Collectors.groupingBy(TestClass :: getId));

  分组通过Collectors.groupingBy进行,参数为实体类里的数据列,数据类型为int。

  注:该方法进行分组时返回的Map类型默认为HashMap,是没有顺序的。如果需要顺序进行分组,可以添加设置LinkedHashMap

Map<Integer,List<TestClass>> testClassGroupList2 = list.stream().collect(Collectors.groupingBy(TestClass :: getId, LinkedHashMap::new,Collectors.toList()));

  6、截取

list.stream().skip(start).limit(num).collect(Collectors.toList());

  通过skip()方法进行开始截断,start为起始处的索引值,limit()方法为截断数量限制,num为截取的数量。

  7、判断是否存在

boolean b = list.stream().anyMatch(item -> item.getId().equals(5))

  通过anyMatch()匹配符合条件的数据,只要有一条符合条件则返回true,如果一条也不存在则返回false

 

posted @ 2022-08-29 09:47  我命倾尘  阅读(587)  评论(0编辑  收藏  举报