可变参数:
可变参数:就是形参的个数是可以变化的
格式:修饰符 返回值类型 方法名(数据类型…变量名){}
范例:public static int getSum(int… arr){}
可变参数注意事项:这里的变量其实是一个数组
public class MyVariableParameter2 {
public static void main(String[] args) {
/*
定义一个方法 求N个数的和
*/
int sum1 = getSum(1, 2, 3, 4, 5);
System.out.println(sum1);
}
public static int getSum(int... arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
return sum;
}
}
创建不可变集合:
//JDK1.9以后才可以
方法名 | 说明 |
---|---|
ststic List of(E…elements) | 创建一个具有指定元素的List集合对象 |
ststic Set of(E…elements) | 创建一个具有指定元素的Set集合对象 |
ststic <K,V> Map <K,V> of(E…elements) | 创建一个具有指定元素的Map集合对象 |
public class MyVariableParameter4 {
public static void main(String[] args) {
//集合的批量添加
//首先是通过调用List.of方法来创建一个不可变的集合,of方法的形参就是一个可变参数
//再创建一个ArrayList集合,并把这个不可变的集合中所有的数据,都添加到ArrayList中.
ArrayList<String> list = new ArrayList<>(List.of("a","b","c","d"));
System.out.println(list);
//传递的参数中,不能存在重复元素
Set<String> set = Set.of("a", "b", "c", "d");
System.out.println(set);
//
Map<String, String> map = Map.of("张三", "江苏", "李四", "北京", "王五", "山海");
System.out.println(map);
//
Map<String, String> map1 = Map.ofEntries(Map.entry("张三", "江苏"), Map.entry("李四", "北京"));
System.out.println(map1);
}
}
1.在List,Set,Map接口中,都存在of方法,可以创建一个不可变的集合
2.这个集合不能添加,不能删除,不能修改.
3.但是可以结合集合的带参构造,实现集合的批量添加.
4.在Map接口中,还有一个ofEntries方法可以提高代码的阅读性
首先会把键值对封装成一个Entry对象,再把这个Entry对象添加到集合当中
Stream流:
操作集合
stream流的三类方法:
stream流的获取方法:
单列集合:
可以使用Collection接口中的默认方法stream()生成流
default Stream stream()
双列集合:
间接的生成流
可以通过keySet或者entrySet获取一个set集合,在获取Stream流
数组:
Arrays中的静态方法stream生成流
同种数据类型的多个数据:
1,2,3,4,5…
“aaa”,“bbb”,“ccc”…
使用stream.of(T…values)生成流
/*
Stream流的获取
单列集合: 集合对象,stream();
双列集合: 不能直接获取,需要间接获取
集合对象.keySet().stream();
集合对象.entrySet().stream();
集合对象.entrySet().stream();
数组 : Arrays.stream(数组名);
同种数据类型的多个数据 :
stream.of(数据1,数据2,数据3);
*/
public class MyStream1 {
public static void main(String[] args) {
//单列集合
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)));
list.stream().forEach(s -> System.out.println(s));
//双列集合
HashMap<String,Integer> hm = new HashMap<>();
hm.put("zhangsan",23);
hm.put("lisi",24);
hm.put("wangwu",23);
//双列集合不能直接获取Stream流
//keyset 先获取到所有的键 再把这个set集合中所有的键放到stream流中
//hm.keySet().stream().forEach(s -> System.out.println(s));
//entrySet
//现货区到所有的键值对对象
//再把这个set集合中所有的键值对对象放到stream流中
hm.entrySet().stream().forEach(s-> System.out.println(s));
//数组
int[] arr = {1,2,3,4};
Arrays.stream(arr).forEach(s-> System.out.println(s));
//同种数据类型的多个数据
Stream.of(1,2,3,4,5,6,7).forEach(s-> System.out.println(s));
}
}
中间方法 filter:
public class MyStream3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无忌");
list.add("张翠山");
list.add("王二麻子");
list.add("张亮");
list.add("谢广坤");
//filter方法获取流中的 每一个数据
//而test方法中的s,就依次表示流中的每一个数据
//我们只要在test方法中对s进行判断就可以了
//如果判断的结果为true,则当前的数据留下
//如果判断的结果为false,则当前数据不要
/* 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));//以张开头的
}
}
stream流中常见的中间操作方法:
Stream limit(long maxSize):截取指定参数的个数
Stream skip(long n):跳过指定参数个数的数据
static Stream concat(Stream a,Stream b):合并a和b另两个流为一个流
Stream distinct():取出流中的重复元素.依赖(hashCode和equals方法)
public class MyStream4 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无忌");
list.add("张翠山");
list.add("王二麻子");
list.add("张亮");
list.add("谢广坤"); list.add("谢广坤"); list.add("谢广坤"); list.add("谢广坤");
// Stream<T> limit(long maxSize):截取指定参数的个数
list.stream().limit(2).forEach(s-> System.out.println(s));
// Stream<T> 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.concat(list.stream(),list2.stream()).forEach(s -> System.out.println(s));
// Stream<T> distinct():取出流中的重复元素.依赖(hashCode和equals方法)
list.stream().distinct().forEach(s -> System.out.println(s));
}
}
stream流的常见终结操作方法:
void forEach(Consumer action):对此流的每个元素执行操作
Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
long count():返回此流中的元素数
public class MyStream5 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无忌");
list.add("张翠山");
list.add("王二麻子");
list.add("张亮");
list.add("谢广坤");
// void forEach(Consumer action):对此流的每个元素执行操作
// Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
//在forEach方法的底层,会循环获取到流中的每一个数据
//并循环调用accept方法,并把每一个数据传递给accept方法
//s就依次表示了流中的每一个数据
//所以,我们只要在accept方法中,写上马上处理的业务逻辑就可以了
list.stream().forEach(
new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
}
);
System.out.println("============================");
//lambda表达式的简化格式
//是因为Consumer接口中,只有一个accept方法
list.stream().forEach(
(String s)-> {System.out.println(s);}
);
System.out.println("============================");
//lambda表达式进一步简化
list.stream().forEach(s-> System.out.println(s));
System.out.println("============================");
// long count():返回此流中的元素数
long count = list.stream().count();
System.out.println(count);
}
}
Stream流的收集操作:
需求:过滤元素并遍历集合
public class MyStream6 {
public static void main(String[] args) {
/*
*/
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add(i);
}
/* list.stream().filter(
(Integer i)->{
return i % 2 == 0;
}
);*/
list.stream().filter(number -> number%2 == 0).forEach(number -> System.out.println(number));
System.out.println("=================================");
for (Integer integer : list) {
System.out.println(integer);
}
/*2
4
6
8
10
=================================
1
2
3
4
5
6
7
8
9
10*/
}
}
结论:在Stream流中无法直接修改集合,数组等数据源中的数据.
Stream流的收集操作:
Stream流的收集方法:
R collect(Collector collector)
工具类Collectors提供了具体的收集方式:
public static Collector toList():把元素收集到List集合中
public static Collector toSet():把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中
public class MyStream7 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list1.add(i);
}
list1.add(10);
//List可以有重复的
//set不保留有重复的
//
List<Integer> list = list1.stream().filter(number -> number % 2 == 0).
collect(Collectors.toList());
System.out.println(list);
Set<Integer> set = list1.stream().filter(number -> number % 2 == 0).collect(Collectors.toSet());
System.out.println(set);
/*[2, 4, 6, 8, 10, 10]
[2, 4, 6, 8, 10]*/
}
}
File:
IO流是什么?
1.可以将数据从本地文件中读取出来
2.可以将数据从内存保存到本地文件
File类是什么?
1.在读写数据时告诉虚拟机要操作的(文件/文件夹)在哪
File类概述和构造方法
File:它是文件和目录路径名的抽象表示
文件和目录可以通过File封装成对象
File封装的对象仅仅是一个路径名.他可以是存在的,也可以是不存在的.
方法名 | 说明 |
---|---|
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例 |
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例 |
public class FileDemo1 {
public static void main(String[] args) {
//File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
String path = "D:\\itheima\\a.txt";
File file = new File(path);
//为什么要把字符串表示形式的路径变成File对象
//就是为了使用file的方法
//File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例
String path1 = "D:\\itheima";
String path2 = "a.txt";
File file1 = new File(path1,path2);//把两个路径进行拼接
System.out.println(file1);//D:\itheima.a.txt
//File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例
File file3 = new File("D:\\itheima");
String path3 = "a.txt";
File file4 = new File(file3,path3);
System.out.println(file4);//D:\itheima\a.txt
}
}
1.2绝对路径和相对路径【理解】
-
绝对路径
是一个完整的路径,从盘符开始
-
相对路径
是一个简化的路径,相对当前项目下的路径
-
示例代码
1.3File类创建功能【应用】
-
方法分类
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
public class FileDemo3 {
public static void main(String[] args) throws IOException {
//public boolean createNewFile()创建一个新的空文件夹
//注意点:
//1.如果文件存在,那么创建失败,返回false
//2.如果文件不存在,那么创建成功,返回true
//3.createNewFile方法不管调用者有没有后缀名,只能创建文件
File file = new File("D:\\itheima\\a.txt");
boolean result1 = file.createNewFile();
System.out.println(result1);
//public boolean mkdir() 创建一个单级文件夹
//注意点:
//1.只能创建单级文件夹,不能创建多级文件夹
//2.不管调用者有没有后缀名,只能创建单级文件夹
File file2 = new File("D:\\itheima\\a\\b\\c");
boolean result2 = file.mkdir();
System.out.println(result2);//false
//public boolean mkdirs()创建一个多级文件夹
//注意点:
//1能创建单级文件夹,能创建多级文件夹
//2.不管调用者有没有后缀名,只能创建文件夹
File file3 = new File("D:\\itheima\\aa\\bb\\cc");
boolean result3 = file3.mkdirs();
System.out.println(result3);
}
}
1.4File类删除功能【应用】
-
方法分类
方法名 说明 public boolean delete() 删除由此抽象路径名表示的文件或目录
public class FileDemo4 {
public static void main(String[] args) {
//删除D:\itheima\a.txt
//删文件 直接删除
File file = new File("D:\\itheima\\a.txt");
boolean result = file.delete();
System.out.println(result);
//删文件夹
//只能删空文件夹
//如果要删有文件的文件夹 只能先删除里面的文件 然后在删文件夹
File file1 = new File("D:\\itheima");
boolean result1 = file.delete();
System.out.println(result1);
}
}
1.5File类判断和获取功能【应用】
-
判断功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在 -
获取功能
方法名 说明 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或目录的名称 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
public class FileDemo5{
public static void main(String[] args) {
//判断是否为目录
File file1 = new File("D:\\itheima");
boolean result1 = file1.isDirectory();
System.out.println(result1);
//判断是否为文件
File file2 = new File("D:\\itheima\\a.txt");
boolean result2 = file2.isFile();
System.out.println(result2);
//判断文件是否存在
File file3 = new File("D:\\itheima\\a.txt");
boolean result3 = file3.isFile();
System.out.println(result3);
}
}
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("D:\\itheima\\a.txt");
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
String path = file.getPath();
System.out.println(path);
String name = file.getName();
System.out.println(name);
}
}
1.6File类练习一【应用】
-
案例需求
在当前模块下的aaa文件夹中创建一个a.txt文件
-
实现步骤
- 创建File对象,指向aaa文件夹
- 判断aaa文件夹是否存在,如果不存在则创建
- 创建File对象,指向aaa文件夹下的a.txt文件
- 创建这个文件
public class Test1 {
public static void main(String[] args) throws IOException {
//创建 aaa目录下的a.txt
File file = new File("day_11\\aaa");
if(!file.exists()){
file.mkdirs();
}
File newFile = new File(file,"a.txt");
newFile.createNewFile();
}
}