一、Stream 流
1.Stream 流配合Lambda表达式,简化集合和数组操作
2.Stream 流思想
1)将数据到流中(获取流对象)
① 集合获取 Stream 流对象,使用 Collection 接口中的默认方法
default Stream<E> stream() 获取当前集合对象的 Stream 流
例:
List<String> list = new ArrayList<String>();
list.add("张三丰");
list.add("张无忌");
list.stream().forEach(s -> System.out.println(s))
//Map集合获取Stream流对象, 需要间接获取,- map.entrySet().stream()
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("张三丰", 100);
map.put("张无忌", 35);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
entrySet.stream().forEach(s -> System.out.println(s));
② 数组获取 Stream 流对象,使用 Arrays 数组工具类中的静态方法
static <T> Stream<T> stream(T[] array)将传入的数组封装到 Stream 流对象中
例:
int[] arr = {11, 22, 33};
Arrays.stream(arr).forEach(s -> System.out.println(s));
⑤ 零散的数据获取 Stream 流对象,使用 Stream 类中的静态方法
static <T> Stream<T> of(T... values)把一堆零散的数据封装到 Stream 流对象中
Stream.of(1, 2, 3, 4, 5, 6).forEach(s -> System.out.println(s));
2)中间方法 - 操作后返回Stream对象, 可以继续操作
//示例准备
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "林青霞", "张曼玉", "王祖贤", "柳岩","张敏","张无忌");
① Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
列: list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(
s -> System.out.println(s));//张曼玉,张无忌
② Stream<T> limit(long maxSize) 获取前几个元素
列:
// "林青霞", "张曼玉"
list.stream().limit(3).forEach(s -> System.out.println(s));
③ Stream<T> skip(long n) 跳过前几个元素
列:
// "柳岩","张敏","张无忌"
list.stream().skip(3).forEach(s -> System.out.println(s));
④ Stream<T> distinct() 去除流中重复的元素依赖 (hashCode 和 equals方法)
列: s3.distinct().forEach(s -> System.out.println(s));
⑤ static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
例:
// 取前4个数据组成一个流
Stream<String> s1 = list.stream().limit(4);
// 跳过2个数据组成一个流
Stream<String> s2 = list.stream().skip(2);
//合并s1和s2得到的流
Stream<String> s3 = Stream.concat(s1, s2);
注意事项: 流对象已经被使用过就不允许再次使用了.
3)终结方法
Stream流的终结操作方法 - 流水线中的最后一道工序
public void forEach (Consumer action) 对此流的每个元素执行遍历操作
public long count () 返回此流中的元素数
3.Stream 收集操作
把 Stream 流操作后的结果数据转回到集合,Stream 流操作,不会修改数据源
1)把 Stream 流操作后的结果数据转回到集合
R collect(Collector collector) 开始收集Stream流,指定收集器
2)Collectors 工具类提供了具体的收集方式
public static <T> Collector toList() 把元素收集到List集合中
public static <T> Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper , Function valueMapper)把元素收
集到Map集合中
例:
//把元素收集到List集合中
List<Integer> list1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).filter(
s -> s % 2 == 0
).collect(Collectors.toList());
//把元素收集到List集合中
Set<Integer> list2 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10).filter(
s -> s % 2 == 0
).collect(Collectors.toSet());
ArrayList<String> list = new ArrayList<>();
list.add("张三,23");
list.add("李四,24");
list.add("王五,25");
Map<String, Integer> map = list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return Integer.parseInt(s.split(",")[1]) >= 24;
}
}).collect(Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s.split(",")[0];
}
}, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split(",")[1]);
}
}));
例:
现在有两个 ArrayList 集合,分别存储6名男演员和6名女演员,要求完成如下的操作:
男演员只要名字为3个字的前两人
女演员只要“小”字开头的,并且不要第一个
把过滤后的男演员姓名和女演员姓名合并到一起
把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
演员类MyActor ,里面有一个成员变量,一个带参构造方法,以及成员变量对应的
get/set方法
代码:
public static void main(String[] args) {
ArrayList<String> boy = new ArrayList<>();
Collections.addAll(boy, "郭靖", "黄药师", "王祖贤", "乔峰","杨过","张无忌");
ArrayList<String> girl = new ArrayList<>();
Collections.addAll(girl, "黄蓉", "林超风", "小龙姐", "赵敏","周芷若","小昭");
//男演员只要名字为3个字的前两人
Stream<String> boy_1 = boy.stream().filter(s -> s.length() == 3).limit(2);
//女演员只要“小”字开头的,并且不要第一个
Stream<String> girl_1 = girl.stream().filter(s -> s.startsWith("小")).skip(1);
//男演员姓名和女演员姓名合并到一起
Stream<String> Actor = Stream.concat(boy_1, girl_1);
//遍历数据
Actor.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
MyActor A = new MyActor(s);
System.out.println(A);
}
});
}
//演员类MyActor
class MyActor{
private String name;
public MyActor() {}
public MyActor(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Actor{name = " + name + "}";
}
}
二、File 类
File类代表操作系统的文件对象(文件、文件夹)
构造方法 :
1. public File (String pathname) : 根据传入的字符串路径封装File对象
File f = new File("D:\\A.txt");
2. public File (String parent, String child) : 根据传入的父级路径和子级路径来封装File对象
File f = new File("D:\\", "test");
3. public File (File parent, String child) : 根据传入的父级路径(File类型)和子级路径来封装File
对象
File f = new File(new File("D:\\"), "test");
File 对象可以定位文件和文件夹
File 封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
路径的写法 :
1. 绝对路径: 从盘符根目录开始,一直到某个具体的文件或文件夹
2. 相对路径: 相对于当前项目
例:
public static void main(String[] args) throws IOException {
File f = new File("src/com/itheima/day12\\A.txt");
f.createNewFile();
}
常见方法 :
1. 判断相关
public boolean isDirectory() : 判断是否是文件夹
public boolean isFile() : 判断是否是文件
public boolean exists() : 判断是否存在
例:
File f1 = new File("D:\\A.txt");
System.out.println(f1.isDirectory()); // false
System.out.println(f1.isFile()); // true
System.out.println(f1.exists()); // true
2. 获取相关
public long length() : 返回文件的大小(字节数量)
* 文件对象操作, 返回正确的字节个数
* 文件夹对象操作, 返回的是错误的字节个数
public String getAbsolutePath() : 返回文件的绝对路径
public String getPath() : 返回定义文件时使用的路径
public String getName() : 返回文件的名称,带后缀
public long lastModified() : 返回文件的最后修改时间(时间毫秒值)
例:
System.out.println(f1.length());
System.out.println(f1.getAbsolutePath());
System.out.println(f1.getPath());
System.out.println(f1.getName());
System.out.println(new Date(f1.lastModified()));
3.创建方法和删除方法
public boolean createNewFile() :创建文件
public boolean mkdir() : 创建单级文件夹
public boolean mkdirs() : 创建多级文件夹
public boolean delete() : 删除文件或文件夹(慎用)
- delete 方法删除文件夹, 只能删除空的文件夹.
例:
public static void main(String[] args) throws IOException {
File f1 = new File("src\\com\\itheima\\day12\\B.txt");
System.out.println(f1.createNewFile());
File f2 = new File("src\\com\\itheima\\day12\\aaa");
System.out.println(f2.mkdirs());
File f3 = new File("src\\com\\itheima\\day12\\C.txt");
System.out.println(f3.mkdirs());
System.out.println(f1.delete());
System.out.println(f2.delete());
}
4.遍历方法
public File[] listFiles() 获取当前目录下所有的 "一级文件对象" 返回 File 数组
① 当调用者File表示的路径不存在时,返回null
② 当调用者File表示的路径是文件时,返回null
③ 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
④ 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
例:
public static void main(String[] args) {
File f = new File("D:\\test");
File[] files = f.listFiles();
for (File file : files) {
System.out.println(file);
}
}