阅读量: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)); } }