Java Stream流操作全解析
Hello大家好我是Yize好久不见呀今天我们准备一起来学习一个非常有意思的内容——Stream流话不多说我们现在开始目录Stream流的获取方式及使用Stream流的中间方法map方法的使用Stream流的终结方法toArray的使用方法collect的使用方法总结Stream流的获取方式及使用//单列集合利用stream流遍历数据 ArrayListString list new ArrayList(); list.stream().forEach(s - System.out.println(s)); //双列集合利用stream流遍历数据 HashMapString,String hm new HashMap(); hm.put(张三,北京); hm.put(李四,上海); hm.put(王五,福建); //第一种遍历方式 hm.keySet().stream().forEach(key - System.out.println(key)); //第二种遍历方式 hm.entrySet().stream().forEach(entry - System.out.println(entry)); //数组利用stream流遍历数据 int [] arr1 {1,2,3,4,5,6,7,8,9,10};//基本数据类型有重载方法 Arrays.stream(arr1).forEach(i - System.out.println(i)); String [] arr2 {a,b,c,d,e};//引用数据类型直接使用泛型 Arrays.stream(arr2).forEach(s - System.out.println(s)); //一堆零散数据同种数据类型————调用Stream中的of方法 Stream.of(1,2,3,4,5,6,7,8,9,10).forEach(i - System.out.println(i)); Stream.of(a,b,c,d,e).forEach(s - System.out.println(s));Stream接口中of方法的细节1. 方法的形参是一个可变数据类型可以传递一堆零散的数据也可以传入数组2. 但是传入的数组必须是引用数据类型如果是基本数据类型方法会自动将其整体看作一个元素存入Stream当中Stream流的中间方法注意点1. 中间的方法返回新的stream流原来的stream只能使用一次一次性的不能二次使用建议使用链式法则2. 修改stream流中的数据不会影响原来集合或数组的数据3. distinct()方法在底层会使用HashSet因此在使用distinct()方法的时候如果数据类型是我们自己定义的例如Student类要在类里面重写hashCode和equals方法map方法的使用ArrayListString list new ArrayList(); Collections.addAll(list,张三丰-20,张强-19,周芷若-18,谢广坤-20,张翠山-21); //第一个类型流中原本的数据类型 //第二个类型要转成之后的类型 //apply的形参s依次表示流里面的每一个数据 //返回值表示转换之后的数据 //当map方法执行完毕之后流上的数据就变成了整数 //所以在下面forEach当中s依次表示流里面的每一个数据这个数据现在就是整数了 list.stream().map(new FunctionString, Integer() { Override public Integer apply(String s) { String[] split s.split(-); int age Integer.parseInt(split[1]); return age; } }).forEach(s - System.out.println(s)); //链式法则简化 list.stream() .map(s- Integer.parseInt(s.split(-)[1])) .forEach(i - System.out.println(i));Stream流的终结方法toArray的使用方法ArrayListString list new ArrayList(); Collections.addAll(list,张三丰,张强,周芷若,谢广坤,张翠山); //完整匿名内部类格式 String[] array list.stream().toArray(new IntFunctionString[]() { Override public String[] apply(int value) { return new String[value]; } }); System.out.println(Arrays.toString(array)); //利用Lambda表达式的形式对数组进行遍历 String[] arr list.stream().toArray(value - new String[value]); System.out.println(Arrays.toString(arr));collect的使用方法ArrayListString list new ArrayList(); Collections.addAll(list,张三丰-男-20,张强-男-19,周芷若-女-18,谢广坤-男-20,张翠山-女-21); //收集到List集合当中 ListString list1 list.stream() .filter(s - 男.equals(s.split(-)[1])) .collect(Collectors.toList()); System.out.println(list1); //收集到Set集合当中 //Set集合会进行去重操作 SetString set list.stream() .filter(s - 男.equals(s.split(-)[1])) .collect(Collectors.toSet()); System.out.println(set); //收集到Map集合当中 MapString, Integer map1 list.stream() .filter(s - 男.equals(s.split(-)[1])) //toMap中的两个变量分别表示键的生成规则和值的生成规则 //其中里的第一个是流里面的类型第二个是Map集合中键和值的数据类型 //方法apply中的s代表依次获取流里面的每一个数据 //方法体中 书写生成键和生成值的代码 .collect(Collectors.toMap(new FunctionString, String() { Override public String apply(String s) { return s.split(-)[0]; } }, new FunctionString, Integer() { Override public Integer apply(String s) { return Integer.parseInt(s.split(-)[2]); } })); System.out.println(map1); //简化代码 MapString, Integer map2 list.stream() .filter(s - 男.equals(s.split(-)[1])) .collect(Collectors.toMap( s- s.split(-)[0] , s- Integer.parseInt(s.split(-)[2]) )); System.out.println(map2);总结好啦我们本期的学习到此结束啦期待下次分享我们下次见