什么是Stream?
Java8中,Collection新增了两个流方法,分别是Stream() 和 parallelStream() 【/ˈpærəlel/ 音标哈哈哈哈哈】
Java8中添加了一个新的接口类Stream,相当于高级版的 Iterator,ta可以通过 Lambda 表达式对集合进行大批量数据操作,或者高效的聚合数据操作。
为什么要使用 Stream?
在Java8之前,通常用 普通循环、for 循环 或者 Iterator 迭代来重排序合并数据,或者通过重新定义 Collections.sorts的 Comparator 方法来实现,这两种方式对 大数量系统来说,效率不理想。
Stream的聚合操作与数据库SQL 的聚合操作 sorted、filter、map 等类似。应用层可以高效的实现类似数据库SQL 的聚合操作了,而在数据库操作方面,Stream 不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高数据的处理效率。
Stream例子:
// 找出姓张名字最长的长度
List<String> names = Arrays.asList("关羽", "赵云", "刘备", "张飞", "张飞123");
int max = names.stream().filter(name -> name.startsWith("张")).mapToInt(String :: length).max().getAsInt();
System.out.println(max);
用for循环试试:
List<String> names = Arrays.asList("关羽", "赵云", "刘备", "张飞", "张飞123");
List li = new ArrayList();
for(int i = 0; i< names.size(); i++){
li.add(names.get(i).length());
System.out.println("循环中的:" + names.get(i));
}
可以看出 Stream 减少了好几行代码。
stream常用类型:
-
map(): 将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。
-
filter(): 返回结果生成新的流中,只包含满足筛选条件的数据。
-
limit(): 返回指定数量的元素的流。返回的是steam 中前面的 n个元素。
-
skip(): 和 limit() 相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。
-
sorted(): 将流中的元素按照自然排序方式进行排序。
-
distinct(): 将流中的元素去重后输出。
-
peek(): 对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。