此博客所有只是作为个人笔记,个人的知识的总结。如有不对的地方欢迎指出,谢谢。会不断完善笔记的,会发布第一稿然后再后续完善。
stream介绍
stream 是一组用来处理数组和集合的API
目的 简洁代码 较少for循环看起来更舒服 多核友好
特性
1 不是数据结构没有内部存储
2 不支持索引访问
3 惰性化(延迟计算)
4 支持并行
5对于数组和集合有很好的支持性
6支持多种功能 如查找 汇总 过滤等
Stream 构成
组成 源 中间操作 终止操作
源 一定是集合
对于流来说 中间操作可以有多个但是必定有一个返回结果
终止操作一个流只有一个
Stream只有遇见终止操作才会进行遍历
创建源
代码如下
public static void main(String[] args) {
//1 通过数组来生产一个stream对象
String[] strings = {"c", "s", "a", "b"};
// static <T> Stream<T> of(T... values)
//返回一个元素为指定值的顺序排列的流。
Stream<String> stringStream = Stream.of(strings);
stringStream.forEach(System.out::println);
//2 通过集合生成
List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> listStream = list.stream();
listStream.forEach(System.out::println);
// 3 static <T> Stream<T> generate(Supplier<T> s)
//返回一个无穷序列无序流,其中每个元素是由提供 Supplier生成。
//因为是无限的 所以需要东西进行限制 limit方法进行限制
Stream<List> generateStream = Stream.generate(() -> Arrays.asList("我", "是", "帅", "哥"));
generateStream.limit(1).forEach(System.out::println);
//4 iterator iterate(T seed, UnaryOperator<T> f)
//返回一个无穷序列有序 Stream由最初的一元 seed函数的 f迭代应用产生的,产生一个由 seed, f(seed), f(f(seed)) Stream,等。
//第一单元(位置0)在Stream将提供seed。对于n > 0,位置n元素,将在位置n - 1元素的应用功能f结果。
//也就是说第一个是起始值 第二个是UnaryOperator类型的 UnaryOperator是表示一个操作在一个操作数,它产生一个与它的操作数相同的结果的结
Stream<String> integerStream = Stream.iterate("帅",x->x+"1" );
integerStream.limit(5).forEach(System.out::println);
// 5 强转或者说是 相同父类的流的转
String stream="abcd";
IntStream intStream=stream.chars();
intStream.forEach(System.out::println);
}
中间操作
代码如下
public static void main(String[] args) {
//中间操作 其实就是给与流进行一些列筛选 汇总 排序之类的操作的方法
// 第一个进行过滤的操作的方法 Stream<T> filter(Predicate<? super T> predicate);
Arrays.asList(1, 2, 4, 5).stream().filter((x) -> x > 4).forEach(System.out::println);
// 如果是stream对象是返回值的话 则是中间操作
}
终止操作
public static void main(String[] args) {
//终止操作,其实就是结束操作 比如foreach 或者count 这类会返回结果的操作 如果没有终止操作则不会产生执行的结果(也就是不会去执行)
//比如max 就有返回值Optional
Optional<Integer> optional = Arrays.asList(1, 2, 4, 5).stream().max((a, b) -> a - b);
int maxNumber = Arrays.asList(1, 2, 4, 5).stream().max((a, b) -> a - b).get();
System.out.println(maxNumber);
//有些方法没有 比如总和之类的,可以先查接口进行转到intStream 在其中找到相对于的方法
}
API文档中的具体方法
以下为api中stream的方法
二。lambda 表达式
标准格式由三个部分组成。
(参数类型 参数名称)->{}
参数列表 箭头 方法体
FunctionalInterface 被该注解修饰的接口只能一个抽象的方法
lambad 表达式在运行的时候 会新增一个方法 这个方法就是方法体中的方法 还会形成一个匿名内部类 实现接口,重写抽象方法,在重写的方法中调用新的生产的方法
省略写法 1 小括号内的参数类型 可以省略。2 如果只有小括号里只有一个参数 则括号可以省略 3。如果方法体里就一条语句 那么大括号可以省略 return 可以省略
lambda 表达式和匿名内部类的不一样
1 抽象方法的数量不一样。 lambda 只能由一个
2 实现方法不一样 匿名是编译后生成。lambda 是运行的时候生成一个累
3 所需类型不一样。lambda 必须是接口
三 接口中新增 默认方法+静态方法
现在是可以支持 静态方法 默认方法。静态常量 抽象方法
默认方法
因为对新增的抽象方法 所有的接口都要进行实现 这样子不利于开发
并且实现类可以调用接口的默认方法 或者支持重写
静态方法
为了接口的扩展
静态方法 不会被实现类调用 和重写 ,调用的话只能通过接口来调用的
四 函数式的接口
已有的 提供的接口
1 supplier 无参有返回值的接口
2 consumer 有参无返回值的
3 function 有参数也有返回的
4 predicate 有参数 返回为boolean 的
五 方法引用
::
当lambda 的使用内容 或者需要的逻辑有了,可以用这个来进行引用 是一种替换方案
对象::方法名
类名::静态方法/普通方法
类名/数组:: new。构造器。