作用:处理集合和数组等数据。java8引入的
特点:
- 基于数据源的一种元素序列,可以通过数据源的元素,进行某种操作,比如:过滤、排序、映射等。这些操作不会修改元数据的内容。
- 流支持链式调用,每次操作都会返回一个新的流对象,可以连续操作。
- 流操作可以分为两类:中间操作和终端操作,中间操作是指,对流中的元素进行某种转换或筛选,然后返还一个新的流对象,终端操作是指对流进行最终操作,比如:计算、收集并返回结果。
- 流是可以串行或并行的,在并行流中,多个线程可以同时处理不同的流元素,从而提高程序的效率和性能。
使用:
- 创建一个流
- 使用中间方法
- 使用终端方法
API:
获取Stream流的方法:
package com.pjk.demo;
import java.util.*;
import java.util.stream.Stream;
public class Demo_Stream {
public static void main(String[] args) {
//1.单列集合获取strean流 单列集合有 list set 等等
//2.先创建一个单列集合
ArrayList<String> strings = new ArrayList<>();
//3.使用collections工具给单列集合添加元素
Collections.addAll(strings, "a", "b", "c", "d", "e");
//4.使用stream流的中间方法获取数据
strings.stream().forEach(System.out::println);
System.out.println("------------------------------------");
//5.双列集合
HashMap<String, String> map = new HashMap<>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc", "333");
map.put("ddd", "444");
map.put("eee", "555");
map.put("fff", "666");
// get stream
Set<String> keySet = map.keySet();
keySet.stream().forEach(System.out::println);
System.out.println("------------------------------------");
Set<Map.Entry<String, String>> entries = map.entrySet();
entries.stream().forEach(System.out::println);
System.out.println("------------------------------------");
//数组获取 stram流
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Arrays.stream(arr).forEach(System.out::println);
System.out.println("------------------------------------");
//零散数据 使用 stream流
Stream.of(1, 2, 3, 4, 5).forEach(System.out::println);
}
}
stream流的中间方法:
package com.pjk.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
//stream 中间方法
public class Demo_StreamMiddle {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
Collections.addAll(strings, "张三","张思","张思","张思", "张无忌", "李四", "王五", "赵六", "张三丰");
//过滤
strings.stream().filter(s->s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
System.out.println("----------------------");
//获取前几个
strings.stream().limit(3).forEach(System.out::println);
System.out.println("----------------------");
//跳过
strings.stream().skip(4).forEach(System.out::println);
System.out.println("----------------------");
//去重
strings.stream().distinct().forEach(System.out::println);
System.out.println("----------------------");
//concat合并流
ArrayList<String> stringsNew = new ArrayList<>();
Collections.addAll(stringsNew, "吴三","吴思");
Stream.concat(strings.stream(),stringsNew.stream()).forEach(System.out::println);
System.out.println("----------------------");
//类型转换
ArrayList<String> nameAge = new ArrayList<>();
Collections.addAll(nameAge,"zhangsan-10","lisi-11","wangwu-12");
nameAge.stream()
.map(s->Integer.parseInt(s.split("-")[1]))
.forEach(System.out::println);
}
}
stream的终结方法:
package com.pjk.demo;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author PJK
* stream流终结方法
*/
public class Demo_StreamEnd {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
Collections.addAll(strings,"a","b","c");
//遍历
strings.stream().forEach(System.out::println);
//统计
long count = strings.stream().count();
System.out.println(count);
//收集到数组
String[] array = strings.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array));
System.out.println("-------------------");
//收集到集合里
ArrayList<String> nameGenderAge = new ArrayList<>();
Collections.addAll(nameGenderAge,"张三-男-18","张四-男-19","张二-女-17","张大-女-21","张无-男-19","张高楼大厦科技-男-37");
nameGenderAge.stream().filter(s -> "男".equals(s.split("-")[1])).forEach(System.out::println);
System.out.println("------------------------");
List<String> collect = nameGenderAge.stream()
.filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toList());
System.out.println(collect);
System.out.println("-----------------");
//收集到set集合
Set<String> set = nameGenderAge.stream().filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toSet());
System.out.println(set);
System.out.println("-------------------");
//收集到map当中
Map<String, Integer> map = nameGenderAge.stream()
.filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toMap(
s -> s.split("-")[0],
s -> Integer.parseInt(s.split("-")[2])
));
System.out.println(map);
System.out.println(map);
System.out.println("---------------------");
//并行流
nameGenderAge.parallelStream().forEach(System.out::println);//这里的数据量小 体现不出速度 只是简单说下
}
}