Stream流的使用
- 生成流
通过数据源生成流
- 中间操作
一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤映射,然后返回一个新的流
- 终结操作
一个流只能有一个终结操作,当这个操作执行后,流就被使用”光“了,无法在被操作,所以这必定是流的最后一个操作forEach()
Stream流的常见生成方式
Collection体系的集合可以使用默认方法生成流
Map体系的集合间接的生成流
数组可以通过Stram接口的静态方法of(T...vaues)生成流
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
Stream stream = arrayList.stream();
//Map集合
Map<String, Integer> map=new HashMap<>();
Stream<String> stream1 = map.keySet().stream();
Stream<Integer> stream2 = map.values().stream();
//数组
String[] arrs={"hello","java","hi"};
Stream<String> arrs1 = Stream.of(arrs);
filter过滤操作
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("王小明");
arrayList.add("张小红");
arrayList.add("李大力");
arrayList.add("王明");
//以张开头,且长度大于等于3
arrayList.stream().filter((String s)->{ return s.startsWith("王");}).filter((String s)->{return s.length()>=3;}).forEach(System.out::println);
Stream中间操作之limit&skip
limit:取前几个元素组成一个流
skip:跳过几个元素组成一个流
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("王小明");
arrayList.add("张小红");
arrayList.add("李大力");
arrayList.add("王明");
//取前三个数据在控制台输出
arrayList.stream().limit(3).forEach(System.out::println);
System.out.println("--------------");
//跳过三个元素,把剩下的元素在控制台输出
arrayList.stream().skip(3).forEach(System.out::println);
stream流中间操作之concat&distinct
concat:合并两个流为一个流
distinct:返回由该流的不同元素组成的流
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("王小明");
arrayList.add("张小红");
arrayList.add("李大力");
arrayList.add("王明");
//取前三个组成一个流
Stream<String> limit = arrayList.stream().limit(3);
//取后两个组成一个流
Stream<String> skip = arrayList.stream().skip(2);
//合并这两个流输出
// Stream.concat(limit,skip).forEach(System.out::println);
System.out.println("------------------");
//消除重复元素
Stream.concat(limit,skip).distinct().forEach(System.out::println);
stream流中间操作之sorted&sorted(Comparator comparator)
public static void main(String[] args) {
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("zhangsan");
arrayList.add("lisi");
arrayList.add("wangwu");
arrayList.add("zhaoliu");
//按照字母顺序把数据在控制台输出
// arrayList.stream().sorted().forEach(System.out::println);
// 按照字符串长度把数据在控制台输出,并且当长度相同时,按照自然排序
arrayList.stream().sorted((o1,o2)->{int num1= o1.length()-o2.length();
int num2=num1==0?o1.compareTo(o2):0;
return num2;
}).forEach(System.out::println);
stream流中间操作之map&mapToInt
//map 返回由给定函数应用于此流的元素的结果组成的流
//mapToInt:返回一个IntStream其中包含将给定 函数应用鱼此流的元素结果
//arrayList.stream().map(Integer::parseInt).forEach(System.out::println);
arrayList.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
IntStream中有一个sum()求和方法
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("10");
arrayList.add("20");
arrayList.add("30");
arrayList.add("40");
int sum = arrayList.stream().mapToInt(Integer::parseInt).sum();
System.out.println(sum);
Stream流的常见终结方法
forEach()
count:统计集合中有几个元素
//Colluction集合
ArrayList<String> arrayList=new ArrayList();
arrayList.add("10");
arrayList.add("20");
arrayList.add("30");
arrayList.add("40");
long count = arrayList.stream().count();
System.out.println(count);