深圳网站建设哪家强,厦门网页设计代做,自动生成logo,哪些网站做物流推广好文章目录引入流流的操作中间操作终端操作流的使用谓词筛选筛选各异的元素流的切片截断流跳过元素映射流的扁平化查找和匹配归约元素求和、最大值和最小值数值流构建流由值构建流由数组创建流引入流
java api提供的一种利用声明式的方式处理数据集合的一个东西#xff0c;可以…
文章目录引入流流的操作中间操作终端操作流的使用谓词筛选筛选各异的元素流的切片截断流跳过元素映射流的扁平化查找和匹配归约元素求和、最大值和最小值数值流构建流由值构建流由数组创建流引入流
java api提供的一种利用声明式的方式处理数据集合的一个东西可以被看成一个高级迭代器
流的操作
流水线也就是很多流操作本身会返回一个流可以将多个操作连接起来形成一个更大的流
filter() :谓词过滤筛选出适合条件的实体sorted()对集合进行排序map()提取某项元素collect()将流转换为其它形式limit()截断流是元素不超过给定数量流的迭代是内部迭代外部迭代一般是有程序员控制的迭代foreach就属于外部迭代并且流只能遍历一次
中间操作
像filter、sorted等都会生成一个流中间操作也就是会将这些流合并成一个流这个东西也叫做合并循环
终端操作
终端操作会从流水线生成结果其结果是任何不是流的值比如List、Integer、void等
//forEach会返回void的终端操作
menu.stream().forEach(System.out.println);流的使用
谓词筛选
因为流支持filter操作filter是属于行为参数化的可以通过谓词来筛选出我们需要的元素
筛选各异的元素
流可以使用distinct()方法它会返回一个各异元素的流(底层是通过hashcode和equals()实现)
流的切片
takewhile(): filter()会把所有的元素都过一遍如果数据量过大速度会非常慢takewhile()当遇到不符合的元素会停止处理大大节约了时间dropwhile()dropwhile()是对takewhile()的补充它会丢弃掉谓词为false的元素当谓词为true它会停止处理并返回谓词为false的元素
截断流
上面提到了对流进行截断返回给定数量的元素
跳过元素
skip(n)跳过给定数量的元素如果 n 大于元素个数则会返回一个空的流
映射 映射是指map()操作它会返回我们指定的元素属性
流的扁平化
flatMap()的作用是各个数组并不是分别映射成一个流而是映射成流的内容
例子: 给定一个单词表[Hello, World], 想要返回列表[H, e, l, o, W, r, d]第一次尝试:word.stream().map(item-item.split( )).distinct().toCollect()map(item-item.split())的返回结果是StreamString[],我们需要的是StreamString,distinct操作并不能形成我们想要的结果第二次尝试:word.stream().map(item-item.split( )).map(Arrays::stream).distinct().collect()map(Arrays::stream)是将每一个数组变为一个流并不能达到我们要的结果第三次尝试:word.stream().map(item-item.split( )).flatMap(Arrays::stream).distinct().collect()flatMap(Arrays::stream)会将每一个数组的内容分别映射为流的内容然后将流合并形成一个流在进行distinct()就可以达到效果查找和匹配
常见的数据处理的套路是看数据集中的某些元素是否匹配一个给定的元素Stream Api通过allMatch、anyMatch、noneMatch、findFirst和findAny实现
anyMatch()流中是否有一个元素能匹配给定的谓词noneMatch()所有元素是否匹配给定的谓词noneMatch()确保没有元素与给定的谓词匹配findAny()返回当前流的任意元素findFirst()指定流中元素的出现顺序
Optional:一般用来处理空指针异常的允许程序中出现null了一般来说查询的返回结果可以给一个OptionalisPresent():有值返回true没有值返回falseifPresent(ConsumerT block): 会在存在值的时候执行代码块get(T other): 会在值存在时返回值不存在值抛出异常orElse(): 存在值就返回值不存在值就返回一个默认值归约 将流中的元素反复结合起来得到一个值这样的操作叫做归约操作归约的优势在于内部迭代和并行化并行化就是将stream()变为parallelStream()
reduce(初始值一般为0 需要的操作)
int sum numbers.stream().reduce(0, Integer::sum);
//无初始值的情况
OptionalInteger sum numbers.stream().reduce((a,b)- (ab));元素求和、最大值和最小值
OptionalInteger sum numbers.stream().reduce(0, Integer::sum);
OptionalInteger max numbers.stream().reduce(Integer:max);
OptionalInteger min numbers.stream().reduce(Integer:min);数值流
mapToInt(): 返回一个IntStream()mapToDouble()返回一个DoubleStream()OptionalInt 的默认值是0用来求和还行求最大值不适用rangeClosed(1,100)是IntStream的一个方法可以规定数值范围
//使用归约求涉及到拆包的问题
int sum numbers.stream().reduce(0, Integer::sum);
//map的返回值是Stream类,不行
OptionalInteger sum numbers.stream().map(类::方法).sum();
//maptoInt()的返回值是IntStream还支持max()、min()、average()等
OptionalInteger sum numbers.stream().mapToInt(类::方法).sum();
//使用orElse来指定OptionalInt的值,如果没有最大值显方式提供一个默认最大值
OptionalIntInteger test xxx;
int max test.orElse(1);构建流
由值构建流
StreamString stream Stream.of(modern, java, In, Action);
stream.map(String :: toUpperCase).forEach(System.out::println);
//创建一个空的流
StreamString emptyStream Stream.empty();由数组创建流
int[] numbers {2, 3, 5, 7, 11, 13};
int sum Arrays.stream(numbers).sum();