Stream的创建、中间操作、终止
Stream是一组用来处理数组、集合的APIjava8之所以费那么大功夫引入函数式编程,原因有二:-代码简介函数式编程写出的代码简洁且意图明确,使用stream接口,让你从此告别for循环-多核友好,java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。Stream特性1、不是数据结构,没有内部存储2、不支持索引访问3、延迟计算,主要体现在不进行终止操作
Stream是一组用来处理数组、集合的API
java8之所以费那么大功夫引入函数式编程,原因有二:
-代码简介函数式编程写出的代码简洁且意图明确,使用stream接口,让你从此告别for循环
-多核友好,java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。
Stream特性
1、不是数据结构,没有内部存储
2、不支持索引访问
3、延迟计算,主要体现在不进行终止操作的时候,不会进行内部运算
4、支持并行
5、很容易生成数组或者集合(List、Set)
6、支持过滤、查找、转换、汇总、聚合等操作
Stream运行机制
1、Stream分为源source、中间操作、终止操作(源主要是生成流)
2、流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
3、一个流可以有0个或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作
4、Stream只有遇到终止操作,它的源才开始执行遍历操作
Stream的5中创建方式:
**
1、通过数组
2、通过集合
3、同伙Stream.generate()方法来创建
4、通过Stream.iteraate()方法来创建
5、其他API例如
String str=“luozhao你好啊”;
IntStream chars = str.chars();**
package com.ligong.stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.logging.XMLFormatter;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
-
一些声明信息
-
Description: Stream流的生成,一共有五种方法,例如数组生成、集合生成、API提供的generate()方法以及我们
-
ApiZ中迭代器的方法。
-
date: 2021/8/11 16:15
-
@author luozhao
-
@since JDK 1.8
*/
public class TestGenStream {
public static void main(String[] args) {
System.out.println(“这是数组转流------------”);
gen1();
System.out.println(“这是集合转流------------”);
gen2();
System.out.println(“这是StreamAPI中generate()方法------------”);
gen3();
System.out.println(“这是API中的迭代器方式------------”);
gen4();
System.out.println(“这是Stream中的其他转成Stream子类方式------------”);
gen5();
}
public static void gen1(){String[] Str={"王五","李四","李想","曹笠成","姚宝柱子"}; Stream<String> stringStream=Stream.of(Str); stringStream.forEach(System.out::println);
}
public static void gen2(){
List list= Arrays.asList(“1”,“2”,“3”,“4”);
list.stream().forEach(System.out::println);}
public static void gen3(){
//gen
Stream generate = Stream.generate(() -> 1);
generate.limit(10).forEach(System.out::println);
}
public static void gen4(){
//gen
Stream iterate = Stream.iterate(1, x -> x + 1);
iterate.limit(10).forEach(System.out::println);
}
public static void gen5(){
//gen
String str=“luozhao你好啊”;
IntStream chars = str.chars();
//参数是一个对象方法引用
chars.forEach(System.out::println);
}
}
Stream的常用操作:
package com.ligong.stream;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.util.Arrays;
import java.util.Optional;
/**
-
一些声明信息
-
Description:
-
date: 2021/8/11 18:30
-
@author luozhao
-
@since JDK 1.8
/
public class TestCenterStream {
public static void main(String[] args) {
/**
* 对流中的数据求和运算
* 第一步把集合转换为流的形式
* 通过filter过滤器,返回与给定谓词所匹配的流
* mapToInt方法是把流转换为Int类型的流
* sum方法可以对intStream类型的流进行求和
*/
int sum = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().filter(
x -> x % 2 == 0).mapToInt(x -> x).sum();
System.out.println(sum);/** * 通过API方法max对流中的数据进行筛选,其中max中的参数是比较器,通过lambda表达式进行筛选 */ **比较器源码:** ![在这里插入图片描述](https://img-blog.csdnimg.cn/d23dea52c944425da34194f096303780.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbHBsdW96aGFvMTIz,size_16,color_FFFFFF,t_70) Optional<Integer> max = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().max((a, b) -> a - b); System.out.println(max.get()); /** * 通过API方法max对流中的数据进行筛选,其中Mmin中的参数是比较器,通过lambda表达式进行筛选 */ Optional<Integer> min = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().min((a, b) -> a - b); System.out.println(min.get());
}
}
打印匹配的任意一个符合能够整除2条件的数据
打印余数=6的首个数据
打印首个能与谓词i%2==匹配的数据
获取最大值,最小值,不用过滤器,用sort方法,一个是通过自定义比较器的方法一个是Stream类提供的方法。
Stream常用的中间操作API
**
1、过滤filter
2、去重distinct
3、排序sorted
4、截取limit、skip
5、转换map/flatMap
6、其他peek**
Stream常用的终止API
**
1、循环forEach
2、计算min、max、count、average
3、匹配anyMatch、allMatch、noneMatch、findFirst、findAny
4、汇聚reduce
5、收集器 toArray collect**
有些案例没有写,后面有时间爱你会写的。感觉还可以的话点赞收藏呀。
更多推荐
所有评论(0)