目录
1、认识Stream流
- streamjdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。
一些集合或者数组都有相应的方法进行操作数据为什么还要使用stream流呢?stream有什么优势呢?
- 优势:Stream流大量的结合了Lambda的语法风格编程,功能强大,性能高效,代码简洁,可读性好。
体验Stream流

上面需求的代码实现,使用了传统的方法和Stream流两种方法:
java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Demo3Stream {
public static void main(String[] args) {
//目标:认识stream 流,掌握stream 的基本使用,体会它的好处
List<String> list = new ArrayList<>(); //创建数组列表
list.add("张三");
list.add("张三丰");
list.add("熊大");
list.add("赵敏");
list.add("张无忌");
list.add("张翠山");
list.add("光头强");
list.add("小龙女");
//1、现在要将所有以张开头且3字符的元素,存储到一个新集合
//方式1、使用传统方案
//startsWith 判断字符串开头前缀
List<String> list2 = new ArrayList<>();
for (String s : list) {
if(s.startsWith("张") && s.length() == 3){
list2.add(s);
}
}
System.out.println(list2);
//方式2、使用 stream流
System.out.println(list.stream().filter(s -> s.startsWith("张")).
filter(s -> s.length() == 3).collect(Collectors.toList()));
}
}
/*
[张三丰, 张无忌, 张翠山]
[张三丰, 张无忌, 张翠山]
*/
stream流的使用步骤

2、步骤1:获取stream流
- 获取集合的stream流。

java
import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class StreamDemo2 {
public static void main(String[] args) {
//获取stream流
//1、获取集合的stream流
Collection<String> list = new ArrayList<>();
Stream<String> streamList =list.stream(); //获取集合的stream流
//2、获取Map集合的stream流
Map<String, String> map = new HashMap<>();
//map.stream(); //报错
//获得Map集合键的stream流
Stream<String> keyStream= map.keySet().stream();
//获取Map值的stream流
Stream<String > valuesStream = map.values().stream();
//获取键值对的stream流
Stream<Map.Entry<String, String>> EntryStream = map.entrySet().stream();
//3、获取数数组的stream流
String[] arr = {"张三", "李四", "王五"};
//方法1、
Stream<String> streamArr = Arrays.stream(arr); //
//方法2、
Stream<String> streamArr2 = Stream.of(arr);
Stream<String> streamArr3 = Stream.of("张三", "李四", "王五"); //这里可以传入多个参数
}
}
3、步骤2:Stream流常用的方法

java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Demo4Stream {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("熊大");
list.add("张三丰");
list.add("张无忌");
list.add("张翠山");
//对流中的数据进行过滤,只保留姓张的
Stream<String> streamlist = list.stream().filter(s -> s.startsWith("张"));
streamlist.forEach(System.out::println);
//sorted 排序对元素进行排序
List<Double> list2 = new ArrayList<>();
list2.add(4.1);
list2.add(2.1);
list2.add(3.1);
list2.add(1.1);
list2.add(1.1);
list2.add(1.1);
System.out.println("------------------------------排序------------------------------");
Stream<Double> streamsorted = list2.stream().sorted();
streamsorted.forEach(System.out::println); //1.1 2.1 3.1 4.1
System.out.println("---------------------------------自定义排序---------------------------------");
Stream<Double> stream2 = list2.stream().sorted((d1,d2)->d2.compareTo(d1));
stream2.forEach(System.out::println);
System.out.println("------------------------------------------谋取前几个元素------------------------------------------------");
Stream<Double> stream3 = list2.stream().sorted().limit(2);
stream3.forEach(System.out::println);
System.out.println("------------------------------------------------------跳过前几个元素---------------------------------------------------------------");
Stream<Double> stream4 = list2.stream().sorted().skip(2);
stream4.forEach(System.out::println);
System.out.println("_______________________去重____________________");
Stream<Double> stream5 = list2.stream().distinct();
stream5.forEach(System.out::println);
System.out.println("_____________________映射_____________________");
Stream<Double> stream6 = list2.stream().map(d -> d * 2).distinct();
stream6.forEach(System.out::println);
System.out.println("_____________________合并_____________________");
Stream<Double> stream7 = Stream.of(1.1,2.2,3.3);
Stream<Double> stream8 = Stream.of(4.4,5.5,6.6);
Stream<Double> stream9 = Stream.concat(stream7,stream8);
stream9.forEach(System.out::println);
}
}
/*
张三丰
张无忌
张翠山
------------------------------排序------------------------------
1.1
1.1
1.1
2.1
3.1
4.1
---------------------------------自定义排序---------------------------------
4.1
3.1
2.1
1.1
1.1
1.1
------------------------------------------谋取前几个元素------------------------------------------------
1.1
1.1
------------------------------------------------------跳过前几个元素---------------------------------------------------------------
1.1
2.1
3.1
4.1
_______________________去重____________________
4.1
2.1
3.1
1.1
_____________________映射_____________________
8.2
4.2
6.2
2.2
_____________________合并_____________________
1.1
2.2
3.3
4.4
5.5
6.6
*/
4、步骤3:Stream流的终极方法
- 终结方法指的是调用完成后,不会返回新的Stream流了,没法继续使流了。

java
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Demo5Stream {
public static void main(String[] args) {
List<Teacher> list = new ArrayList<>();
list.add(new Teacher("张三", 18, 5000));
list.add(new Teacher("张三丰", 50, 5006));
list.add(new Teacher("张无忌", 20, 66008));
list.add(new Teacher("张翠山", 30, 4000));
list.add(new Teacher("赵敏", 18, 15000));
list.stream().filter(t -> t.getSalary() > 10000).forEach(System.out::println);
System.out.println("-----------------");
long count = list.stream().count();
System.out.println(count);
System.out.println("-----------------");
Optional<Teacher>max = list.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
System.out.println(max.get()); //输出最大值对象
System.out.println("-----------------");
Optional<Teacher>min = list.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
System.out.println(min.get());
}
}
/*
Teacher{name='张无忌', age=20, salary=66008.0}
Teacher{name='赵敏', age=18, salary=15000.0}
-----------------
5
-----------------
Teacher{name='张无忌', age=20, salary=66008.0}
-----------------
Teacher{name='张翠山', age=30, salary=4000.0}
*/
5、收集Stream流
- 收集Stream流:就是把Stream流操作后的结果传回到集合或者数组去返回。
- Stream流:方便操作集合/数组的手段;
- 集合/数组:才是开发中的目的。

java
import java.util.*;
import java.util.stream.Collectors;
public class Demo6Stream {
public static void main(String[] args) {
//一个流只能收集一次
System.out.println("--------------收集到List集合---------------------");
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("张无忌");
list.add("熊大");
list.add("赵敏");
//把流收集到List集合
List<String> li = list.stream().collect(Collectors.toList());
li.forEach(System.out::println);
System.out.println("--------------收集到Set集合---------------------");
List<String> list1 = new ArrayList<>();
list1.add("张三");
list1.add("张三丰");
list1.add("张无忌");
list1.add("熊大");
list1.add("赵敏");
//把流收集到Set集合
Set<String> set = list1.stream().collect(Collectors.toSet());
System.out.println( set);
System.out.println("--------------收集到Map集合---------------------");
//把流收集到Map集合
List<Teacher1> list2 = new ArrayList<>();
list2.add(new Teacher1("张三", 5000));
list2.add(new Teacher1("张三丰", 5006));
list2.add(new Teacher1("张无忌", 15008));
// Map<String, Double> map = list2.stream().collect(Collectors.toMap(new Function<Teacher1, String>() {
// @Override
// public String apply(Teacher1 teacher1) {
// return teacher1.getName();
// }
// }, new Function<Teacher1, Double>() {
// @Override
// public Double apply(Teacher1 teacher1) {
// return teacher1.getSalary();
// }
// }));
//优化
Map<String, Double> map = list2.stream().collect(Collectors.toMap(Teacher1::getName, Teacher1::getSalary));
System.out.println( map);
System.out.println("--------------收集到数组---------------------");
List<String> list3 = new ArrayList<>();
list3.add("张三");
list3.add("张三丰");
list3.add("张无忌");
list3.add("熊大");
list3.add("赵敏");
Object[] arr = list3.stream().toArray();
System.out.println(Arrays.toString(arr));
}
}
/*
--------------收集到List集合---------------------
张三
张三丰
张无忌
熊大
赵敏
--------------收集到Set集合---------------------
[张三, 熊大, 张三丰, 赵敏, 张无忌]
--------------收集到Map集合---------------------
{张三=5000.0, 张三丰=5006.0, 张无忌=15008.0}
--------------收集到数组---------------------
[张三, 张三丰, 张无忌, 熊大, 赵敏]
*/