lambda表达式是stream的基础,初学者建议先学习lambda表达式: JDK8-lambda表达式。 及其JDK8-Optional类
文章目录
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);
}