day08-stream流,file,io流
体验Stream流
-
需求:按照下面的要求完成集合的创建和遍历
- 创建一个集合,存储多个字符串元素
- 把集合中所有以“张”开头的元素存储到一个新的集合
- 把”张“开头的集合中的长度为3的元素存储到一个新的集合
- 遍历上一步得到集合
-
Stream流的三类方法
- 获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
- 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
- 终结方法
- 一个Streamm流只能有一个终结方法。是流水线上的最后一个操作
- 获取Stream流
-
Stream流的获取方法
-
单列集合
-
//可以使用Collection接口中的默认方法stream()生成流 default Stream<E> streamm()
-
-
双列集合
- 间接的生成流
- 可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
-
数组
- Arrays中的静态方法stream生成流
-
同种数据类型的多个数据
-
1,2,3,4,5... "aaa","bbb","ccc"... //使用Stream.of(T...values)生成流
-
-
案例
-
package com.day08; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.stream.Stream; /** * 单列集合:集合对象.stream() * 双列集合:不能直接获取,需要间接获取 * 集合对象.keySet().stream(); * 集合对象.entrySet.stream(); * 数组: Arrays.stream(数组名); * 同种数据类型的多个数据: * Stream.of(数据1,数据2,数据3...); */ public class MyStream2 { public static void main(String[] args) { //单列集合 method1(); //双列集合 method2(); //数组 method3(); //同种数据类型的多个数据 method4(); } private static void method4() { //同种数据类型的多个数据 Stream.of(1,2,3,4,5,6,7,8).forEach(s-> System.out.println(s)); } private static void method3() { //数组 int[] arr = {1,2,3,4,5}; Arrays.stream(arr).forEach(s-> System.out.println(s)); } private static void method2() { //双列集合 HashMap<String,Integer> map = new HashMap<>(); map.put("aaa",1); map.put("bbb",2); map.put("ccc",3); //双列集合不能直接获取Stream流 //keySet //先获取到所有的键 //再把这个Set集合中所有的键放到Stream流中 map.keySet().stream().forEach(s-> System.out.println(s)); //entrySet //先获取所有的键值对对象 //再把这个set集合中所有的键值对对象放到stream流中 map.entrySet().stream().forEach(s-> System.out.println(s)); } private static void method1() { //单列集合 ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); Stream<String> stream = list.stream(); stream.forEach(s-> System.out.println(s)); } }
-
-
Stream流的常见中间操作方法
-
-
package com.day09; import java.util.ArrayList; import java.util.function.Predicate; public class MySteram3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("张三丰"); list.add("张无忌"); list.add("老六"); //filter方法中获取流中的每一个数据。 //而test方法中的s,就依次表示流中的每一个数据。 //我们只要在test方法中对s进行判断就可以了 //结果为true就保留当前数据 list.stream().filter(new Predicate<String>() { @Override public boolean test(String s) { boolean result = s.startsWith("张"); return result; } }).forEach(s-> System.out.println(s)); //因为Predicate接口中只有一个抽象方法test //所以我们可以使用lambda表达式来简化 list.stream().filter((String s)->{ boolean result = s.startsWith("张"); return result; }).forEach(s-> System.out.println(s)); //简化 list.stream().filter(s-> s.startsWith("张")).forEach(s-> System.out.println(s)); } }
-
-
-
package com.day09; import java.util.ArrayList; import java.util.stream.Stream; public class MyStream4 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("张三丰"); list.add("张三丰"); list.add("张无忌"); list.add("老六"); //limit(long maxSize):截取指定参数个数的数据 list.stream().limit(2).forEach(s-> System.out.println(s)); //skip(long n):跳过指定参数个数的数据 list.stream().skip(2).forEach(s-> System.out.println(s)); //static<T> Stream<T> concat(Stream a,Stream b):合并a和b两个流为一个流 ArrayList<String> list2 = new ArrayList<>(); list2.add("张三丰"); list2.add("张无忌"); list2.add("老六"); // Stream<String> stream1 = list.stream(); // Stream<String> stream2 = list2.stream(); // Stream<String> stringStream = Stream.concat(stream1, stream2); // stringStream.forEach(s-> System.out.println(s)); //简化 Stream.concat(list.stream(),list2.stream()).forEach(s-> System.out.println(s)); //distinct():去除流中重复的元素。依赖(hashCode和equals方法) list.stream().distinct().forEach(s-> System.out.println(s)); } }
-
Stream流的常见终结操作方法
Stream流的收集操作
-
-
package com.day09; import java.util.ArrayList; public class MyStream5 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } list.stream().filter( number->number%2==0 ).forEach(number-> System.out.println(number)); System.out.println("---------------------"); for (Integer integer : list) { System.out.println(integer); } } }
-
结论:在Stream流中无法直接修改集合,数组等数据源中的数据。
-
Stream流的收集操作
-
Stream流的收集方法
-
R collect(Cllector collector)
-
练习
File和IO流
File
-
绝对路径和相对路径
-
File类创建功能
-
File删除功能
-
File类判断和获取功能
-
File类高级获取功能
-
File file1 = new File("D:\\"); File[] files = file1.listFiles();//返回值是一个File类型的数组 for (File path : files) { System.out.println(path); }
递归删除文件夹
-
package com.day09.filedemo; import java.io.File; import java.io.IOException; public class FileDemo2 { public static void main(String[] args) throws IOException { //删除一个多级文件夹 //delete方法 //只能删除文件和空文件夹 File file = new File("D:\\test"); deleteDir(file); } private static void deleteDir(File file) { //先删除文件夹里面的内容,再删除这个文件夹 //递归 //注意:可以解决所有文件夹和递归相结合的题目 //1.进入---得到当前文件夹里面所有内容的File对象. File[] files = file.listFiles(); //2.遍历---因为我想得到 文件夹里面的每一个文件和文件夹的File对象 for (File file1 : files) { if(file1.isFile()){ //3.判断---如果遍历的File对象是一个文件则直接删除 file1.delete(); }else{ //4.判断 //如果是文件夹则递归 deleteDir(file1);//参数一定要是 当前文件夹里面的文件夹File对象 } } //最后删除这个文件夹 file.delete(); } }
统计文件夹出现的次数
-
package com.day09.filedemo; import java.io.File; import java.util.HashMap; public class FileDemo3 { public static void main(String[] args) { File file = new File("itheima-oop-polymorphic"); HashMap<String,Integer> hm = new HashMap<>(); getCount(hm,file); System.out.println(hm); } private static void getCount(HashMap<String, Integer> hm, File file) { File[] files = file.listFiles(); for(File f:files){ if(f.isFile()){ String fileName = f.getName(); String[] fileNameArr = fileName.split("\\."); if(fileNameArr.length ==2){ String fileEndName = fileNameArr[1]; if(hm.containsKey(fileEndName)){ //已经存在 //将已经出现的次数获取出来 Integer count = hm.get(fileEndName); //这种文件又出现了一次 count++; //把已经出现的次数给覆盖掉 hm.put(fileEndName,count); }else { //不存在 //表示当前文件第一次出现 hm.put(fileEndName,1); } } }else { getCount(hm, f); } } } }