[置顶] Java 8新增的Stream操作
来源:互联网 发布:网络主播工资怎么算的 编辑:程序博客网 时间:2024/06/05 07:01
一 Stream流概述
1 Java 8还新增了Stream、IntStream、LongStream、DoubleStream等流式API。
2 独立使用Stream的步骤如下:
(1)使用Stream或XxxStream的builder()类方法创建该Stream对应Builder。
(2)重复调用Builder的add()方法向该流中添加多个元素。
(3)调用Builder的build()方法获取对应的Stream。
(4)调用Stream的聚集方法。
3 Collection接口提供了一个stream()默认方法,该方法可返回该集合对应的流,接下来即可通过流API来操作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Stream极大了丰富了集合的功能。
二 Stream的中间方法和末端方法的应用
1 代码示例
import java.util.stream.*;public class IntStreamTest{public static void main(String[] args){IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();// 下面调用聚集方法的代码每次只能执行一个//System.out.println("is所有元素的最大值:" + is.max().getAsInt());//输出20//System.out.println("is所有元素的最小值:" + is.min().getAsInt());//输出-2//System.out.println("is所有元素的总和:" + is.sum());//输出49//System.out.println("is所有元素的总数:" + is.count());//输出4//System.out.println("is所有元素的平均值:" + is.average());//输出 OptionalDouble[12.25]//System.out.println("is所有元素的平方是否都大于20:"//+ is.allMatch(ele -> ele * ele > 20));//输出false//System.out.println("is是否包含任何元素的平方大于20:"//+ is.anyMatch(ele -> ele * ele > 20));//输出true// 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1IntStream newIs = is.map(ele -> ele * 2 + 1);// 使用方法引用的方式来遍历集合元素newIs.forEach(System.out::println); // 输出41 27 -3 37}}
2 运行结果
41
27
-3
37
3 代码分析
上面代码先创建了一个IntStream,接下来分别多次调用IntStream的聚集方法执行操作,这样即可获取该流的相关信息。
Stream流提供了大量的方法进行聚集操作,这些方法既可以是“中间的”,也可以是“末端的”。
中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的map()方法就是中间方法。中间方法的返回值是另外一个流。
末端方法:末端方法是对流的最终操作。当对某个Stream执行末端方法后,该流就会被“消耗”且不可再用。上面程序的sum()。count()、average()等方法都是末端方法。
三 Stream的filter方法的应用
1 代码示例
import java.util.*;import java.util.function.*;public class CollectionStream{public static void main(String[] args){// 创建books集合、为books集合添加元素的代码与8.2.5小节的程序相同。Collection books = new HashSet();books.add(new String("轻量级Java EE企业应用实战"));books.add(new String("疯狂Java讲义"));books.add(new String("疯狂iOS讲义"));books.add(new String("疯狂Ajax讲义"));books.add(new String("疯狂Android讲义"));// 统计书名包含“疯狂”子串的图书数量System.out.println(books.stream().filter(ele->((String)ele).contains("疯狂")).count()); // 输出4// 统计书名包含“Java”子串的图书数量System.out.println(books.stream().filter(ele->((String)ele).contains("Java") ).count()); // 输出2// 统计书名字符串长度大于10的图书数量System.out.println(books.stream().filter(ele->((String)ele).length() > 10).count()); // 输出2// 先调用Collection对象的stream()方法将集合转换为Stream,// 再调用Stream的mapToInt()方法获取原有的Stream对应的IntStreambooks.stream().mapToInt(ele -> ((String)ele).length())// 调用forEach()方法遍历IntStream中每个元素.forEach(System.out::println);// 输出8 11 16 7 8}}
2 运行结果
4
2
2
8
11
16
7
8
3 代码分析
代码只要调用Collection的stream()方法即可返回该集合对应的Stream,接下来调用Stream提供的方法对所有集合中的元素进行处理,这样可以大大简化集合编程的代码,这也是Stream编程带来的优势。
代码最后一句先调用Collection对象的stream()方法将集合转换为Stream对象,然后调用Stream对象的mapToint()方法将其转换为IntStream,这个mapToInt()方法就是一个中间方法,因此程序可继续调用IntStream的forEach()方法来遍历流中的元素。
- [置顶] Java 8新增的Stream操作
- Java的stream流操作
- 使用Java 8新增的Predicate操作来操作集合
- [Java 8] (7) 利用Stream类型的"懒"操作
- 详解Java 8中Stream类型的“懒”操作
- Java 8 Stream 流已被操作或关闭
- Java 8 之 Stream 操作符
- java 8 Stream()操作流介绍
- JAVA Stream 简单操作
- java stream操作
- 置顶操作的实现
- java中新增的逻辑操作符"^"
- Java新增的Predicate操作集合
- [置顶] java Cookie操作总结
- java实现列表的上下移动和置顶操作
- Java8的Stream操作
- 在Java 8中对stream带有lambda表达式的操作进行调试
- JAVA 8 StreamAPI 和 lambda表达式 总结(四)--stream的一些聚合操作
- 一步一图一代码,一定要让你真正彻底明白红黑树(平衡二叉树)
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
- [置顶] 怎样进行薪酬谈判
- thinkphp5实践第3章——后台admin操作
- 关系型数据库和NOsql
- [置顶] Java 8新增的Stream操作
- [置顶] 我的私房IT图书馆
- xcompressCU
- 操作系统管理内存的机制——为什么要设置虚拟内存
- Java生成带计算的验证码
- [置顶] 我的私房IT学习网站
- Spring-8 , bean的作用域
- [置顶] Java 6和Java 7对throw语句的不同理解
- PHP中 var 修饰符的作用