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()));

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章