一、Stream流的概述
1、什么是Stream流
- 在Java8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念
- 目的:用于简化集合和数组操作的API
2、Stream流式思想的核心
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后用这个Stream流简化的API来方便的操作元素
二、Stream流的获取
1、Stream流的三类方法
- 获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作。
- 中间方法
- 流水线上的操作。一次操作完毕后,还可以继续进行其他操作。
- 终结方法
- 一个Stream流只能有一个终结方法,是流水线上最后一个操作。
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能
集合获取Stream流的方式
- 可以使用Collection接口中的默认方法stream()生成流
//Collection集合获取流
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
//Map集合获取流
Map<String, Integer> maps = new HashMap<>();
//键流
Stream<String> keyStream = maps.keySet().stream();
//值流
Stream<Integer> valueStream = maps.values().stream();
//键值对流(拿整体)
Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream();
//数组获取流
String[] name = {"a", "b", "c", "d"};
Stream<String> nameStream = Arrays.stream(name);
Stream<String> nameStream2 = Stream.of(name);
2、Stream流常用API
- forEach:注意处理(遍历)
- count;统计个数
- filter:过滤元素
- limit:取前几个元素
- skip:跳过前几个
- map:加工方法
- concat:合并流
List<String> list = new ArrayList<>();
list.add("abb");
list.add("bba");
list.add("za");
list.add("ac");
list.add("adc");
list.add("abb");
list.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));
long size = list.stream().filter(s -> s.length() == 3).count();
System.out.println(size);//4
list.stream().filter(s -> s.startsWith("a")).limit(2).forEach(s -> System.out.println(s));//终结操作
//map加工方法: 第一个参数原材料 -> 第二个参数是加工后的结果
//给集合元素都加上一个w
list.stream().map(s -> "w" + s).forEach(s -> System.out.println(s));
//把所有名称都加工成学生对象
list.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
//合并流
Stream<String> s1 = list.stream().filter(s -> s.startsWith("a"));
Stream<String> s2 = Stream.of("g", "h");
Stream<String> s3 = Stream.concat(s1, s2);
s3.forEach(s -> System.out.println(s));
三、收集Stream流
1、Stream流的手机操作
- 收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。
- Stream流:方便操作集合/数组的手段
- 集合/数组:才是开发中的目的
2、Stream流的收集
List<String> list = new ArrayList<>();
list.add("abb");
list.add("bba");
list.add("za");
list.add("ac");
list.add("adc");
list.add("abb");
Stream<String> s1 = list.stream().filter(s -> s.startsWith("a"));
List<String> alist = s1.collect(Collectors.toList());
System.out.println(alist);//[abb, ac, adc, abb]
//注意:流只能使用一次
Stream<String> s2 = list.stream().filter(s -> s.startsWith("a"));
Set<String> aset = s2.collect(Collectors.toSet());
System.out.println(aset);//[abb, adc, ac]
Stream<String> s3 =list.stream().filter(s -> s.startsWith("a"));
Object[] arrs = s3.toArray();
System.out.println(Arrays.toString(arrs));//[abb, ac, adc, abb]