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