stream流

Leetcode1333题用到。

关于stream

stream特性

​ stream主要具有如下三点特性,在之后我们会对照着详细说明

    (1)stream不存储数据

    (2)stream不改变源数据

    (3)stream的延迟执行特性

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

1
2
3
Stream<String> stream = Stream.generate(()->"user").limit(3);
stream.forEach(System.out::println);
stream.forEach(System.out::println);

输出结果:

1
2
3
4
5
user
user
user

java.lang.IllegalStateException: stream has already been operated upon or closed

创建sream

通过数组创建

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
//基本类型
int[] arr = new int[]{1,2,34,5};
IntStream stream = Arrays.stream(arr);
//引用类型
Student[] studentArr = new Student[]{new Student("s1",29),new Student("s2",27)};
Stream<Student> studentStream = Arrays.stream(studentArr);
//通过Stream.of
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
}

通过集合创建

1
2
3
4
5
6
7
8
public static void main(String[] args) {
List<String> strs = Arrays.asList("11212","dfd","2323","dfhgf");
//创建普通流
Stream<String> stream = strs.stream();
//创建并行流(即多个线程处理)
Stream<String> stream1 = strs.parallelStream();

}

创建空的流

1
2
3
4
public void testEmptyStream(){
//创建一个空的stream
Stream<Integer> stream = Stream.empty();
}

创建无限流

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
//generate:创建无限流
Stream.generate(()->"number"+new Random().nextInt())
.limit(100).forEach(System.out::println);

}
-------------------------------------------
number1248181585
number384976035
number1716213474
number-1389767666
number670931654
………………

创建规则的无限流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
//iterate:创建无限流
// 初始值,生成函数的规则
Stream.iterate(0,x->x+1)
.limit(10).forEach(System.out::println);

}
------------------------------------------------
0
1
2
3
4
5
6
7
8
9

Stream操作

map:转换流,将一种类型的流转换为另外一种流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
/**
* map把一种类型的流转换为另外一种类型的流
* 将String数组中字母转换为大写
*/
String[] arr = new String[]{"yes", "YES", "no", "NO"};
Arrays.stream(arr).map(x -> x.toLowerCase()).forEach(System.out::println);

}

-------------------------------------------------
yes
yes
no
no

filter:过滤流,过滤流中的元素

1
2
3
4
5
6
public static void main(String[] args) {
Integer[] arr = new Integer[]{1,2,3,4,5,6,7,8,9,10};
Arrays.stream(arr).filter(x->x>3&&x<8)
.forEach(System.out::println);//4,5,6,7这是找出大于3小于8的数

}

sorted:对流进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* Comparator.comparing是一个键提取的功能
* 以下两个语句表示相同意义
*/
@Test
public void testSorted1_(){
/**
* 按照字符长度排序
*/
Arrays.stream(arr1).sorted((x,y)->{
if (x.length()>y.length())
return 1;
else if (x.length()<y.length())
return -1;
else
return 0;
}).forEach(System.out::println);

Arrays.stream(arr1).sorted(Comparator.comparing(String::length)).forEach(System.out::println);
}

:转载文章请注明出处,谢谢~