JDK8-Stream总结1

lambda表达式是stream的基础,初学者建议先学习lambda表达式: JDK8-lambda表达式。 及其JDK8-Optional类

JDK8-Stream总结2
JDK8-Stream总结3

1 Stream流特点

  • 1.stream不存储数据
  • 2.stream不改变源数据
  • 3.stream的延迟执行特性

通常我们在数组或集合的基础上创建stream,stream不会专门存储数据,对stream的操作也不会影响到创建它的数组和集合,对于stream的聚合、消费或收集操作只能进行一次,再次操作会报错,如下代码:

public static void main(String[] args) {
    Stream<String> stream = Stream.generate(()->"user").limit(5);
    stream.forEach(System.out::println);
    stream.forEach(System.out::println);
}

在这里插入图片描述

2 创建Stream

1)通过数组创建 – Arrays.stream()或者Stream.of()

/**
 * 通过数组创建流
 */
@Test
public void testArrayStream(){
    //1.通过Arrays.stream
    //1.1基本类型
    int[] arr = new int[]{1,2,34,5};
    IntStream intStream = Arrays.stream(arr);
    //1.2引用类型
    Student[] studentArr = new Student[]{new Student("s1",29),new Student("s2",27)};
    Stream<Student> studentStream = Arrays.stream(studentArr);
    //2.通过Stream.of
    Stream<Integer> stream1 = Stream.of(1,2,34,5,65);
    //注意生成的是int[]的流
    Stream<int[]> stream2 = Stream.of(arr,arr);
    stream2.forEach(System.out::println);
}

public class Student {
    private String name;
    private Integer score;
    //-----getters and setters-----
}

2)通过集合创建流 – list.stream()或者list.parallelStream()

/**
 * 通过集合创建流
 */
@Test
public void testCollectionStream(){
    List<String> strs = Arrays.asList("11212","dfd","2323","dfhgf");
    //创建普通流
    Stream<String> stream  = strs.stream();
    //创建并行流
    Stream<String> stream1 = strs.parallelStream();
}

3)创建空的流 – Stream.empty(

@Test
public void testEmptyStream(){
    //创建一个空的stream
    Stream<Integer> stream  = Stream.empty();
}

4)创建无限流 – tream.generate(lambda表达式生成数据)

@Test
public void testUnlimitStream(){
    //创建无限流,通过limit提取指定大小
    Stream.generate(()->"number"+new Random().nextInt()).limit(100).forEach(System.out::println);
    Stream.generate(()->new Student("name",10)).limit(20).forEach(System.out::println);
}

5)创建规律的无限流 Stream.iterate(lamvda表达式生成规律数据)

/**
 * 产生规律的数据
 */
@Test
public void testUnlimitStream1(){
    Stream.iterate(0,x->x+1).limit(10).forEach(System.out::println);
    Stream.iterate(0,x->x).limit(10).forEach(System.out::println);
    //Stream.iterate(0,x->x).limit(10).forEach(System.out::println); 如下代码意思是一样的
    Stream.iterate(0, UnaryOperator.identity()).limit(10).forEach(System.out::println);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值