Java 高级特性之 Stream API 详解

一.Stream特性

  • 没有存储功能,不是存储元素的数据结构
  • 对操作流进行操作获得结果,不影响源数据流
  • 惰性操作,如(Filter、map操作符)
  • 流可以是无限流,而集合是有限
  • 对调用了终止操作符的流,无法再次操作或访问该流,需要重新创建新流
  • 四种操作流:
    - Stream
    - IntStream
    - DoubleStream
    - LongStream
  1. 流的操作可以分为 中间 操作和 终端 操作

    • 中间操作:创建一个新流进行一系列操作转换并返回该新流
      - 有状操作:处理元素时保留看到先前的元素状态,比如 distinct() 去重,sort() 排序等
      - 无状操作:处理元素时不保留先前的元素状态,每个元素都是独立操作,比如 map()

    • 终端操作:执行该操作之后,认为该流就被消耗,如果再次操作该流需要重新返回新流,否则将会报告如下错误:

      Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
      

    2.后续使用到的Java类

    public class Person {
         
    	private int age;
    	private String name;
    	public int getAge() {
         return age;}
    	public void setAge(int age) {
         this.age = age;}
    	public String getName() {
         return name;}
    	public void setName(String name) {
         this.name = name;}
    	public Person(int age, String name) {
         this.age = age;this.name = name;}
    	public Person() {
         }
    	public String toString() {
          return "Person[" + "age=" + age + ", name='" + name + '\'' + ']'; }
    	public static ArrayList<Person> getPersonsList() {
         
        	ArrayList<Person> arrayList = new ArrayList<>();
        	Person bill = new Person(20, "Bill");
        	Person cancel = new Person(25, "Cancel");
        	Person smith = new Person(28, "Smith");
        	Person hanery = new Person(33, "Hanery");
        	Person jerk = new Person(38, "Jerk");
        	Person danvil = new Person(42, "Danvil");
        	arrayList.add(bill);
        	arrayList.add(cancel);
        	arrayList.add(smith);
        	arrayList.add(hanery);
        	arrayList.add(jerk);
        	arrayList.add(danvil);
        	return arrayList;
    	}
    }
    

二.创建Stream的方式

  1. 通过**Collection**集合创建流对象

    Collection接口中定义了default Stream方法

    public interface Collection<E> extends Iterable<E> {
         
    //
    ......
    //
    default Stream<E> stream() {
         
        return StreamSupport.stream(this.spliterator(), false);
    }
    //创建并行流
    default Stream<E> parallelStream() {
         
        return StreamSupport.stream(this.spliterator(), true);
    }
    

    示例:使用 ArrayList 集合创建 Stream

    Stream<Person> stream = Person.getPersonsList().stream();
    stream.forEach(v->System.out.print(v.getName()+"\t"));
    

    2.通过 Stream 的静态方法 empty 创建空的流

    Stream<Object> stream = Stream.empty();
    

    3.通过 Arrays.stream(T [ ] o ) 创建流对象

    Stream<Person> stream = Arrays.stream(new Person[]{
         bill, cancel, smith});
    

    4.通过 Stream.of(T… values) 创建流对象

    Stream<Integer> stream = Stream.of(2, 4, 6, 8, 10);
    

    5.通过 Stream.generate(Supplier s) 创建流,该方法返回一个无限顺序的序列流对象

    Stream.generate(()->new Random().nextInt(20))
    

    6.通过缓冲输出流也创建流对象

    Stream<String> lines = new BufferedReader(new FileReader("\\文件名")).lines();
    

    7.通过 Random 创建流(IntStream、DoubleStream 、LongStream

    IntStream intStream = new Random().ints();
    DoubleStream doubles = new Random().doubles();
    LongStream longs = new 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值