前言:目前Java8新特性在很多公司已经流行起来了,除非很老的公司还在用Java7,所以学习Java8是非常有必要的。
Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。
简而言之StreamAPI提供了一种高效且易于使用的处理数据的方式。
2、Stream流式思想概述
注意: Stream流和IO流没有任何关系,请暂时忘记对传统IO流的固有影响! Stream流思想类似于工厂车间的”生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理,Stream可以看作是流水线上的一个工序;在流水线上,通过多个工序让一个原材料加工成一个商品
lambda表达式对接口的要求:
虽然可以使用lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以使用Lambda表达式来实现。要求接口中定义的必须要实现的抽象方法只能是一个。
四大内置函数
类型 | 类 | 抽象方法 |
---|
消费型接口 | Consumer<T> | void accept(T t) |
供给型接口 | Supplier<T> | T get(); |
函数型接口 | Function<T,R> | R app1y(T t) |
断言型接口 | Predicate<T> | boolean test(T t) |
2.1、流程
1.第一步:把集合转换为流stream
2.第二步:操作stream流stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal)operation 得到前面处理的结果
2.2、特点
1.代码简洁:函数式编程编写出的代码简洁且意图明确,使用stream接口让你从此告别for循环
2.多核友好:Java 函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下方法
2.3、操作符
两种:中间操作符、终止操作符
2.4、中操作符
流方法 | 示例 |
---|
filter | 用于通过设置的条件过滤出元素 |
dustinct | 返回一个元素各异(根据流所生成元素的hashCode 和equals方法实现)的流 |
limit | 会返回一个不超过给定长度的流 |
skip | 返回一个扔掉了前n个元素的流 |
map | 接收一个函数作为参数。这个函数会被应用到每一个元素上,并将其映射成一个新的元素(使用映射一词,是因为他和转换类似,但其中的细微差别在于它是创建一个新版本而不是去修改) |
flatMap | 使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流 |
sorted | 返回排序后的流 |
3、注意事项:
1.Stream只能操作一次 2.Stream方法返的是新的流 3.Stream不调用终结方法,中间的操作不会执行
4、例子
Stream更加优雅的解决方案:
public static void main(String[] args) {
// 定义一个list集合
List<String> list = Arrays.asList("123", "1245", "4643", "748188", "543637", "12567788");
// 1.获取所有带1的信息
// 2.获取所有长度为4的信息
list.stream().filter(a -> a.indexOf("1") > -1).filter(a -> a.length() == 4).forEach(a -> System.out.println(a));
System.out.println("****************************************");
list.stream().filter(a -> a.indexOf("1") > -1).filter(a -> a.length() == 4).forEach(System.out::println);
}
如今JDK17已于2021年9月份发布了,我相信还是很多公司没有提前去升级java版本,Java8依然是目前主流的版本,即是升级到最新版本,依然也是能够沿用Java8新特性的。