Java中的Stream流

avatar
作者
筋斗云
阅读量:0

Stream流

文章目录

初识Stream流

体验Stream;流的作用

需求:按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素

ArrayList<String> list = new ArrayList<>(); list.add("张无忌"); list.add("周芷若"); list.add("赵敏"); list.add("张强"); list.add("张三丰"); 

要求:

  • 把所有以“张”开头的元素存储到新集合中
  • 把“张”开头的,长度为3的元素再存储到新集合中
  • 遍历打印最终结果
package com.example.demo;  import java.util.ArrayList;  public class Text {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         list.add("张无忌");         list.add("周芷若");         list.add("赵敏");         list.add("张强");         list.add("张三丰");  //        1.把所有以“张”开头的元素存储到新集合中         ArrayList<String> list1 = new ArrayList<>();         for (String name : list) {             if(name.startsWith("张")){                 list1.add(name);             }         }  //        2.把“张”开头的,长度为3的元素再存储到新集合中         ArrayList<String> list2 = new ArrayList<>();         for (String name : list1) {             if(name.length() == 3){                 list2.add(name);             }         }  //        3.遍历打印最终结果         System.out.println(list2);     } } 
package com.example.demo;  import java.util.ArrayList;  public class Text {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         list.add("张无忌");         list.add("周芷若");         list.add("赵敏");         list.add("张强");         list.add("张三丰");          list.stream().filter(name->name.startsWith("张"))                 .filter(name->name.length() == 3)                 .forEach(name-> System.out.println(name));     } } 

Stream流的作用

结合Lambda表达式,简化集合、数组的操作

Stream流的使用步骤

①先得到一条Stream流(流水线),并把数据放上去

在这里插入图片描述

package com.example.demo;  import java.util.ArrayList; import java.util.Collections;  public class Text {     public static void main(String[] args) {         //单列集合         ArrayList<String> list = new ArrayList<>();         Collections.addAll(list,"a","b","c","d","e");         list.stream().forEach(s-> System.out.println(s));     } } 
package com.example.demo;  import java.util.HashMap;  public class StreamDemo2 {     public static void main(String[] args) { //        1.创建双列集合         HashMap<String,Integer> hm = new HashMap<>(); //        2.添加数据         hm.put("a",1);         hm.put("b",2);         hm.put("c",3);         hm.put("d",4); //        3.第一种获取获取Stream流的方法 //        hm.keySet().stream().forEach(s-> System.out.println(s)); //        4.第二种获取Stream流的方法         hm.entrySet().stream().forEach(s-> System.out.println(s));     } } 
package com.example.demo;  import java.util.Arrays;  public class StreamDemo3 {     public static void main(String[] args) { //        1.创建数组         int[] arr = {1,2,3,4,5,6,7,8,9,10}; //        2.获取Stream流,引用数据类型同样适用         Arrays.stream(arr).forEach(s-> System.out.println(s));     } } 
package com.example.demo;  import java.util.stream.Stream;  public class StreamDemo4 {     public static void main(String[] args) {     //一对零散的数据         Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));         Stream.of("a","b","c").forEach(s -> System.out.println(s));         //Stream接口中静态方法of的细节         //方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组         //但数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中     } } 

②利用Stream流中的API进行各种操作

1.过滤 转换 中间方法:方法调用完毕之后,还可以调用其他方法

在这里插入图片描述

package com.example.demo;  import java.util.ArrayList; import java.util.Collections;  public class StreamDemo5 {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         Collections.addAll(list,"张无忌","周芷若","赵敏","张三丰");         list.stream().filter(s-> s.startsWith("张"))                 .filter(s->s.length() == 3)                 .forEach(s-> System.out.println(s));         list.stream().limit(3).forEach(s-> System.out.println(s));         list.stream().skip(4).forEach(s-> System.out.println(s));        } }  
package com.example.demo;  import java.util.ArrayList; import java.util.Collections;  public class StreamDemo6 {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         Collections.addAll(list,"张无忌","张无忌","张无忌","周芷若","赵敏","张三丰");         list.stream().distinct().forEach(s-> System.out.println(s));     } } 
package com.example.demo;  import java.util.ArrayList; import java.util.Collections; import java.util.function.Function;  public class StreamDemo7 {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         Collections.addAll(list,"张无忌-15","张无忌-15","张无忌-15","周芷若-16","赵敏-17","张三丰-17"); //        需求:只获取里面的年龄并进行打印 //        第一个类型:流中原来的数据类型 //        第二个类型:要转成之后的数据类型 //        apply的形参s:依次表示流里面的每一个数据 //        返回值:表示转换之后的数据 //        当map方法执行完毕之后,流上的数据就变成整数了 //        所以forEach方法里的s依次表示流里面的每一个数据,这个数据现在是整数         list.stream().map(new Function<String, Integer>() {             public Integer apply(String s){                 String[] arr = s.split("-");                 String ageString = arr[1];                 int age = Integer.parseInt(ageString);                 return age;             }         }).forEach(s-> System.out.println(s));          list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));     } } 

注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。

注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据。

2.统计 打印 终结方法:最后一步,调用完毕之后,不能调用其他方法

在这里插入图片描述

package com.example.demo;  import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util.function.IntFunction;  public class StreamDemo8 {     public static void main(String[] args) {         ArrayList<String> list = new ArrayList<>();         Collections.addAll(list, "张无忌", "张无忌", "张无忌", "周芷若", "赵敏", "张三丰", "张强");         //Consumer的泛型:表示流里面的数据          //accept方法的形参s:依次表示流里面的每一个数据 //        方法体:对每一个数据的处理操作(打印)         /*list.stream().forEach(new Consumer<String>() {             @Override             public void accept(String s) {                 System.out.println(s);             }         });*/  //        list.stream().forEach(s-> System.out.println(s));  //        long count = list.stream().count(); //        System.out.println(count);  //        Object[] arr = list.stream().toArray(); //        System.out.println(Arrays.toString(arr));          //IntFunction的泛型:具体数组的类型         //apply的形参:流中数据的个数,要跟数组的长度保持一致         //apply返回值:具体类型的数组         //方法体:就是创建数组          //toArray方法的参数的作用:负责创建一个指定类型的数组         //toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中         //toArray方法的返回值:是一个装着流里面所有数据的数组 //        String[] arr = list.stream().toArray(new IntFunction<String[]>() { //            @Override //            public String[] apply(int value) { //                return new String[value]; //            } //        }); // //        System.out.println(Arrays.toString(arr));          String[] arr2 = list.stream().toArray(value -> new String[value]);         System.out.println(Arrays.toString(arr2));     } } 

在这里插入图片描述
在这里插入图片描述

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!