当前位置: 代码迷 >> 综合 >> jdk8 stream 常用集合操作map、sorted、limit、min、max、filter、reduce、joining、groupingBy
  详细解决方案

jdk8 stream 常用集合操作map、sorted、limit、min、max、filter、reduce、joining、groupingBy

热度:16   发布时间:2023-12-11 19:27:35.0

一、stream使用前须知

paralleStream并行是否一定比Stream串行快?

答:错误,数据量少的情况,可能串行更快,ForkJoin会耗费性能

多数情况下并行比串行快,是否可以都用并行?

答:不行,部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题

Jdk9 接口中的静态方法不能被实现类继承和子接口继承,但是接口中的非静态默认方法可以被实现类继承?

例如List.of()方法,ArrayList虽然继承了List,但是不能使用ArrayList.of()方法

 

二、常用方法(map、sorted、limit、min、max、filter、reduce、joining、groupingBy)

(一)、获取集合每个实体类中某个字段并组成一个新的集合

List<String> idString =matMatterDTO.getMatMatterPolicyList().stream().map(MatMatterPolicy::getPolicyId).collect(Collectors.toList());

 

(二)、获取list集合中对象重新组合成新对象并存入list中

List collect = matThemeCommonUseList.stream().map(MatThemeCommonUse::getMaterialItemId).collect(Collectors.toList());

List collect = matThemeCommonUseList.stream().map(obj -> {

UserDTO userDTO = UserDTO(obj.getId(),obj.getName());

return userDTO;

}).collect(Collectors.toList());

 

(三)、集合有所有字符串类型转换为int类型

List<Integer> ids = idString.stream().map(Integer::parseInt).collect(Collectors.toList());

 

(四)、数字用逗号拼接成字符串->通过逗号分开再转数值类型

String ids= "1,2,3,4,5,6";

List ids = Arrays.asList(ids.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

 

(五)、集合有所有字符串字母小写变大写

List list= Arrays.asList("a", "b", "c", "d");

List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());

System.out.println(collect); //[A, B, C, D]

 

(六)、数组所有元素,按某种规律计算:

List num = Arrays.asList(1,2,3,4,5);

List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());

System.out.println(collect1); //[2, 4, 6, 8, 10]

 

(七)、集合中数据通过长度来排序并且降序(排序默认升序)

list.stream().sorted().collect(Collectors.toList());

list.stream().sorted(Comparator.comparing(obj -> obj.length()),Comparator.reverseOrder()).collect(Collectors.toList());

list.stream().sorted(Comparator.comparing(String::length).reversed()).collect(Collectors.toList());

集合中获取所有对象的年龄倒序的集合

List collect4 = stuList.stream().map(Student::getAge).distinct().sorted().collect(Collectors.toList());

 

(八)、集合中获取limit数据

list.stream().sorted().limit(3).collect(Collectors.toList());

 

(九)、集合中所有得数据都匹配 allMatch

boolean flag = list.stream().allMatch(obj->obj.length()>5);

集合中有匹配得数据

boolean flag = list.stream().anyMatch(obj->obj.length()>5);

 

(十)、集合中最大最小值 min max

Optional optionalStudent = list.stream().min(s1,s2)->{

return Integer.compare(s1.getAge(),s2.getAge());

});

Student student = optionalStudent.get();

 

(十一)、过滤长度大于5 filter

List resultList = List.stream().filter(obj->obj.length() >5).collect(Collectors.toList())

filter(city -> ! "".equals(city). //过滤掉city不为空的值v

 

(十二)、reduce聚合操作

Stream,of(1,2,3,4,5,4).reduce(item1,item2) -> item1+item2).get();

初始值为100,结果再和第二个元素相加直到全部相加完成

Stream,of(1,2,3,4,5,4).reduce(100,(sum,item) -> sum+item);      

 

(十三)、集合拼接成字符串joining聚合

String result = list.stream().collect(Collectors.joining("11"));

使用||拼接  字符串开头[  结尾]

String result = list.stream().collect(Collectors.joining("||","[","]"));

 

(十四)、partitioningBy分区

Map result = list.stream().collection(Collectors.partitioningBy(obj->obj.length()>4));

 

(十五)、groupingBy 根据学生所在省份分组

Map result = students.stream().collect(Collectors.groupingBy(obj->obj.getProvice()));

 

(十六)、groupingBy 每个省份有多少人

new Student("广东",12)

Map result = students.stream().collect(Collectors.groupingBy(obj->obj.getProvice(),Collectors.counting()));

 

(十八)、集合中年根据年龄分组

Map, List> collect6 = stuList.stream().collect(Collectors.groupingBy(Student::getAge));

System.out.println(collect6.keySet().toString());

System.out.println(collect6.get(20));

 

(十九)、根据年龄和性别分组

Map, Map, List>> collect8 = stuList.stream().collect(Collectors.groupingBy(Student::getAge,Collectors.groupingBy(Student::getSex)));

for (Integer key : collect8.keySet()) {

System.out.println(collect8.get(key));

}

 

 (二十)、集合统计

IntSummaryStatistics summaryStatistics = student.stream().collect(Collectors.summarizingInt(Student::getAge));

summaryStatistics.getAverage();(平均值)

summaryStatistics.getCount();(数量值)

summaryStatistics.getMax()(最大数)

summaryStatistics.getMin()(最小数)

summaryStatistics.getSum()(总和)

 

(二十一)、两个订单平均价格

double orderAvg = order.stream().collect(Collectors.averagingInt(VideoOrder::getMoney)).doubleValue();

  相关解决方案