Java8
中有两个最为重要的改变。
第一就是Lambda
表达式;另一个就是Stream API
算法
Stream
是Java8
中处理集合的关键抽象概念,他能够指定你但愿对集合进行的操做,能够执行很是复杂的查找,过滤,和映射数据等操做。数据库
使用Stream API
对集合数据进行操做,就相似使用SQL
执行的数据库查询。也可使用Stream API
进行并行执行操做。数组
简而言之,StreamAPI
提供了一种高效且易于使用的处理数据的方式。dom
a sequence of elements supporting sequential and parallel aggregate operations.
Stream
是元素的集合(这点让stream
看起来相似iterator
),能够支持顺序和并行 的对原stream
进行汇聚操做ide
Stream
当成一个高级版本的Iterator
。原始版本的Iterator
,用户只能一个一个的遍历元素并对其执行某些操做;高级版本的Stream
,用户只要给出须要对其包含的元素执行什么操做,好比“过滤掉长度大于10的字符串”、“获取每一个字符串的首字母”等,具体这些操做如何应用到每一个元素上,就给Stream
就行了!你们看完这些可能对Stream尚未一个直观的认识,莫急,我们来段代码。code
List<Person> pList = new ArrayList<>(); Person p1 = new Person("tom", "23", "175", "36512@qq.com"); Person p2 = new Person("jack", "34", "185", "888@qq.com"); Person p3 = new Person("rose", "14", "176", "9566@qq.com"); pList.add(p1); pList.add(p2); pList.add(p3); int count = (int) pList.stream().filter(x -> x.getAge().equals("23")).count(); System.out.println("count:" + count);
上面这段代码获取的是年纪为23的人的个数对象
注意点blog
上图就是对于Stream
例子的一个解析,能够很清楚的看见:本来一条语句被三种颜色的框分割成了三个部分接口
红色框中的语句是一个Stream
的生命开始的地方,负责建立一个Stream
实例element
绿色框中的语句是赋予Stream
灵魂的地方,把一个Stream
转换成另一个Stream
,红框的语句生成的是一个包含全部nums
变量的Stream
,进过绿框的filter
方法之后,从新生成了一个过滤掉原nums
列表全部null
之后的Stream
蓝色框中的语句是丰收的地方,把Stream
的里面包含的内容按照某种算法来汇聚成一个值,例子中是获取Stream
中包含的元素个数。
建立Stream
存在两种途径
Stream
静态工厂方法Collection
接口的默认方法--stream()
,把一个Collection
对象转成Stream
流一、经过 of(T...)
方法
List<Student> studentList = new ArrayList<>(); studentList.add(new Student(1,"赵迪",23)); studentList.add(new Student(2,"tom",25)); studentList.add(new Student(2,"jack",27)); studentList.add(new Student(2,"rose",22)); Stream stream = Stream.of(studentList);
二、经过generator()
方法
generator
方法能够生成一个无限长度的Stream,其元素的生成是经过给定的Supplier
(这个接口能够当作一个对象的工厂,每次调用返回一个给定类型的对象)
Stream.generate(new Supplier<Double>() { @Override public Double get() { return Math.random(); } }); Stream.generate(() -> Math.random()); Stream.generate(Math::random);
三条语句的做用都是同样的,只是使用了lambda
表达式和方法引用的语法来简化代码。
每条语句其实都是生成一个无限长度的Stream
,其中值是随机的。
这个无限长度Stream
是懒加载,通常这种无限长度的Stream
都会配合Stream
的limit()
方法来用。
以下的代码是collection
源码中的默认方法,因此说能够直接在子类中获取stream
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }