Stream API 操作
2021-04-28 14:02:50 27 举报
AI智能生成
Stream API java8 jdk8 流操作
作者其他创作
大纲/内容
Stream API
生成流的方式主要有五种
通过集合生成,应用中最常用的一种
通过数组生成
通过值生成
通过文件生成
通过函数生成 提供了iterate和generate两个静态方法从函数中生成流
流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算
流的操作类型
中间操作
一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历,真正的遍历需等到终端操作时,常见的中间操作有下面即将介绍的filter、map等
filter筛选
distinct去除重复元素
limit返回指定流个数
skip跳过流中的元素
map流映射
所谓流映射就是将接受的元素映射成另外一个元素List<String> stringList = Arrays.asList(\"Java 8\
flatMap流转换
将一个流中的每个值都转换为另一个流List<String> wordList = Arrays.asList(\"Hello\
元素匹配
allMatch匹配所有
anyMatch匹配其中一个
noneMatch全部不匹配
终端操作
一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法再被操作,因此一个流只能被遍历一次,若想在遍历需要通过源数据在生成流。终端操作的执行,才会真正开始流的遍历。如下面即将介绍的count、collect等
统计流中元素个数
查找
findFirst查找第一个
findAny随机查找一个
reduce将流中的元素组合起来求和
获取流中最小最大值
通过min/max获取最小最大值
Optional<Integer> min = menu.stream().map(Dish::getCalories).min(Integer::compareTo);Optional<Integer> max = menu.stream().map(Dish::getCalories).max(Integer::compareTo);也可以写成:OptionalInt min = menu.stream().mapToInt(Dish::getCalories).min();OptionalInt max = menu.stream().mapToInt(Dish::getCalories).max();min获取流中最小值,max获取流中最大值,方法参数为Comparator<? super T> comparator
通过minBy/maxBy获取最小最大值
Optional<Integer> min = menu.stream().map(Dish::getCalories).collect(minBy(Integer::compareTo));Optional<Integer> max = menu.stream().map(Dish::getCalories).collect(maxBy(Integer::compareTo));minBy获取流中最小值,maxBy获取流中最大值,方法参数为Comparator<? super T> comparator
通过reduce获取最小最大值
Optional<Integer> min = menu.stream().map(Dish::getCalories).reduce(Integer::min);Optional<Integer> max = menu.stream().map(Dish::getCalories).reduce(Integer::max);
求和
通过summingInt
int sum = menu.stream().collect(summingInt(Dish::getCalories));如果数据类型为double、long,则通过summingDouble、summingLong方法进行求和
通过reduce
通过sum
int sum = menu.stream().mapToInt(Dish::getCalories).sum();
在上面求和、求最大值、最小值的时候,对于相同操作有不同的方法可以选择执行。可以选择collect、reduce、min/max/sum方法,推荐使用min、max、sum方法。因为它最简洁易读,同时通过mapToInt将对象流转换为数值流,避免了装箱和拆箱操作
通过averagingInt求平均值
double average = menu.stream().collect(averagingInt(Dish::getCalories));如果数据类型为double、long,则通过averagingDouble、averagingLong方法进行求平均
通过summarizingInt同时求总和、平均值、最大值、最小值
IntSummaryStatistics intSummaryStatistics = menu.stream().collect(summarizingInt(Dish::getCalories));double average = intSummaryStatistics.getAverage(); //获取平均值int min = intSummaryStatistics.getMin(); //获取最小值int max = intSummaryStatistics.getMax(); //获取最大值long sum = intSummaryStatistics.getSum(); //获取总和如果数据类型为double、long,则通过summarizingDouble、summarizingLong方法
通过foreach进行元素遍历
返回集合
List<String> strings = menu.stream().map(Dish::getName).collect(toList());Set<String> sets = menu.stream().map(Dish::getName).collect(toSet());
通过joining拼接流中的元素
String result = menu.stream().map(Dish::getName).collect(Collectors.joining(\
进阶通过groupingBy进行分组
进阶通过partitioningBy进行分区
别用声明式编程的语法干命令式编程的勾
0 条评论
下一页