总结
- 回顾接口可存放: 常量 抽象方法 default方法 static方法
匿名内部类:接口和抽象类对象只使用一次,就可以使用匿名内部类
当使用匿名内部类创建一个函数式接口的时候,可以使用lambda来简化匿名内部类
publicclassReviewLambdaDemo{publicstaticvoidmain(String[] args){// 1、通过Runnable接口来创建线程对象newThread(()->System.out.println("2023要结束了")).start();// 2、在一个list集合里面放入5个数字,将按数字的降序排列ArrayList<Integer> list =newArrayList<>();Collections.addAll(list,1,60,3,12,56);TreeSet<Integer> ts =newTreeSet<>((a,b)-> b - a);
ts.addAll(list);System.out.println(ts);// 3、将一个指定文件夹里面所有ppt文件拿到File file =newFile("e:/pp");File[] files = file.listFiles(f -> f.isFile()&& f.getName().endsWith(".ppt"));// 遍历数组for(File f : files){System.out.println(f);}// 4、随机产生10个不重复的随机偶数,遍历HashSet<Integer> set =newHashSet<>();while(set.size()<10){int num =(int)(Math.random()*20+1);if(num %2!=0)continue;
set.add(num);}
set.forEach(a ->System.out.println(a));}}
Lambda
- 语法结构 简化使用匿名内部类创建对象的
- 方法引用:简化特殊lambda构造方法引用:类名::new 实例的方法的引用:对象名::方法名 类方法的方法引用:类名::方法名
- 讲解方法引用 方法引用:对特殊的lambda简化的一种语法 ()-> {lambda体} 特殊的lambda:当lambda体只有1句代码,并且这句代码是在调用一个方法 java中的方法: 构造方法:new 构造方法() 实例方法:对象名.方法名() 类方法(静态方法):类名.方法名()构造方法的方法引用的语法:类名::方法名(简化lambda调用构造方法)
publicclassLambdaDemo1{publicstaticvoidmain(String[] args){// 创建IFacotryDog对象IFacotryDog ifd =(name,age)->newDog(name,age);// 创建函数接口对象Dog d = ifd.create("小可爱",3);System.out.println(d);// 上面代码中lambda,可以使用构造方法的引用来简化// 创建IFacotryDog对象IFacotryDog ifd2 =Dog::new;// 类名:调用构造方法的类名::newDog d2 = ifd2.create("老可爱",3);System.out.println(d2);}}
publicclassDog{privateString name;privateInteger age;publicDog(){}publicDog(String name,Integer age){this.name = name;this.age = age;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicIntegergetAge(){return age;}publicvoidsetAge(Integer age){this.age = age;}@OverridepublicStringtoString(){return"Dog{"+"name='"+ name +'\''+", age="+ age +'}';}}
/**
* 创建Dog对象的接口
*/publicinterfaceIFacotryDog{Dogcreate(String name,Integer age);}
类方法引用:类名(调用方法存放的类)::方法名(要调用的方法名)
publicinterfaceIChangeStringNumber{intchange(String number);}
/**
* 讲解类方法引用:类名(调用方法存放的类)::方法名(要调用的方法名)
*/publicclassLambdaDemo2{publicstaticvoidmain(String[] args){// 创建函数式接口IChangeStringNumber对象IChangeStringNumber icsn = n ->Integer.parseInt(n);int num = icsn.change("123");System.out.println(num);// 上面代码中lambda是在调用一个类方法,使用类方法引用来简化:类名::方法IChangeStringNumber icsn2 =Integer::parseInt;
icsn2.change("123");}}
实例方法的引用:对象::实例方法名
/**
* 设计一个函数式接口
*/publicinterfaceIIsAvi{booleanisAvi(String filename);}
/**
* 讲解实例方法的引用
*/publicclassLmbdaDemo3{publicstaticvoidmain(String[] args){// 创建IIsAvi对象IIsAvi avi = fn -> fn.endsWith(".avi");// 创建函数式接口的对象boolean temp = avi.isAvi("蘋蘋在某酒店学习外语.png");System.out.println(temp);// lambda在调用一个实例方法,用实例方法引用来简化:对象::方法名String f ="xxxx.txt";IIsAvi avi2 = f::endsWith;// 实例方法的引用boolean avi1 = avi2.isAvi(f);System.out.println(avi1);// 遍历集合List<Integer> list =Arrays.asList(1,2,3,4,5,6,7);// PrintStream ps = System.out;// list.forEach(a -> ps.println(a));
list.forEach(System.out::println);}}
特殊:类名.方法名()
引用类的实例方法是一种引用特定对象的实例方法。它通常用于将对象的方法作为Lambda表达式的一部分引用。
注意:仅限于对象的get()或)set()方法
stream.map(Person::getName);// 把对象转为对象的name
Stream流
IO流是操作文件流
Stream操作数组或者集合的流
注意:Stream只操作数据,不保存数据
- 通过arrs数组创建Streamint[] arrs = {1,3,5,7,9}; IntStream sm = Arrays.stream(arrs);
- 通过集合对象创建StreamList list = Arrays.asList(1, 2, 3, 4, 56); Stream sm2 = list.stream();
/**
* 讲解Stream流
* IO流是操作文件流
* Stream操作数组或者集合的流
* 注意:Stream只操作数据,不保存数据
*
*/publicclassStreamDemo{publicstaticvoidmain(String[] args){// 1、创建Stream// 1)、通过Arraysint[] arrs ={1,3,5,7,9};IntStream sm =Arrays.stream(arrs);// 通过arrs数组创建Stream// sm是Stream流对象,sm操作的数据源是arrs// 2)、通过集合对象List<Integer> list =Arrays.asList(1,2,3,4,56);Stream<Integer> sm2 = list.stream();// 创建Stream对象// 3)、Stream里面的of方法Stream.of(1,2,3,4,5,6);}}
- Stream流(重点)把数组和集合作为操作数据源- 创建Stream流对象 1. 通过arrs数组创建Stream2. 通过集合对象创建Stream
- 操作流的方法- Stream流的操作步骤: 创建流对象(指定流操作数据源) 操作流:过滤,切片,跳过,截取,去重,排序 结束流:遍历、收集、统计操作流方法:filter(过滤的条件:函数式接口):将不满足条件的数据过滤掉 (Predicate:断言型的接口)limit(long 数字):截取流里面多个数据 limit(3) .limit(3L) // 限制流里面显示的条数 skip():跳过几条 .skip(2L) // 跳过前两条 .limit(4L) // 限制显示4条.distinct():去除重复.sorted():排序,进行排序数据必须实现Comparable .sorted() // 排序(升序) .sorted(Comparator):根据定制排序.map():切片(给你一种类型,变为另一种类型)结束流方法:注意:(结束流方法只能三选一)1. collect():收集 collect(Collectors.toList()); // 将结果收集为一个集2. .count():统计个数3. forEach():遍历 (Consumer:消费型的接口)
publicclassStreamDemo2{publicstaticvoidmain(String[] args){// 1、创建流// IntStream stream = Arrays.stream(new int[]{1,8,6,8,10,12,14,16, 2, 3, 4, 5, 8,6,8,10,12,14,16});// 调用一个方法// List<Integer> list = Arrays.asList(1, 8, 6, 8, 10, 12, 14, 16, 2, 3, 4, 5, 8, 6, 8, 10, 12, 14, 16);// Stream<Integer> stream = list.stream();// // 2、操作流// stream// .filter(a -> a % 2 == 0) // Predicate:断言型的接口// filter(a -> a >= 4)// .distinct() // 去除重复数据// .sorted((o1,o2) -> o2 - o1) // 降序排列// .forEach(System.out::println); // Consumer:消费型的接口// 将字符串里面数字降序输出,去重String str ="12,34,67,5,90,23,4,67,8,9";String[] split = str.split(",");Stream<String> stream =Arrays.stream(split);// 创建流// 将字符串变成intlong count = stream
.map(Integer::parseInt)// Function,将a由String转换int.distinct()// 去重.sorted((o1, o2)-> o2 - o1).count();// 统计流里面个数System.out.println(count);}}
小结Stream流
Stream流的分类
1、串行流:单线程使用(使用最多)
2、并行流:多线程使用
1、创建流
Arrays.stream(数组)
集合对象.stream()
Stream.of(可变参数)
2、流操作的方法:
filter()
limit()
skip()
sorted()
distinct()
map()
forEach()
collect()
count();
publicstaticvoidmain(String[] args){// 创建一个串行流List<Integer> list =Arrays.asList(1,2,3,4,5,6,7,8,9);// Stream<Integer> stream = list.stream();// 创建的串行流// stream.forEach(System.out::println);// 并行流Stream<Integer> integerStream = list.parallelStream();
integerStream.forEach(System.out::println);}}
- Stream的案例
publicclassStreamDemo4{publicstaticvoidmain(String[] args){// 1.有如下7个元素黄药师,冯蘅,郭靖,黄蓉,郭芙,郭襄,郭破虏,使用Stream将以郭字开头的元素存入新数组// String[] names = new String[]{"黄药师", "冯蘅", "郭靖", "黄蓉", "郭芙", "郭襄", "郭破虏"};// Stream<String> stream = Arrays.stream(names);// Object[] array = stream.filter(a -> a.startsWith("郭")).toArray();// Arrays.stream(array).forEach(System.out::println);// 2.已知ArrayList集合中有如下元素{陈玄风、梅超风、陆乘风、曲灵风、武眠风、冯默风、罗玉风},使用Stream// ArrayList<String> arrayList = new ArrayList<>();// arrayList.add("陈玄风");// arrayList.add("梅超风");// arrayList.add("陆乘风");// arrayList.add("曲灵风");// arrayList.add("武眠风");// arrayList.add("冯默风");// arrayList.add("罗玉风");// Stream<String> stream1 = arrayList.stream();//1、取出前2个元素并在控制台打印输出。// stream1.limit(2).forEach(System.out::println);//2、取出后2个元素并在控制台打印输出。// stream1.skip(arrayList.size() - 2).forEach(System.out::println);// Collections.reverse(arrayList);// arrayList.stream().limit(2).forEach(System.out::println);ArrayList<String> manArray =newArrayList<>();
manArray.add("刘德华");
manArray.add("成龙");
manArray.add("吴彦祖");
manArray.add("周润发");
manArray.add("周星驰");
manArray.add("吴京");ArrayList<String> womanList =newArrayList<>();
womanList.add("林心如");
womanList.add("孙俪");
womanList.add("柳岩");
womanList.add("林青霞");
womanList.add("王祖贤");
womanList.add("张曼玉");//1、筛选出前一个姓林的女演员// womanList.stream().filter(a -> a.startsWith("林")).limit(1).forEach(System.out::println);//2、男演员只要名字为3个字的前三人;// manArray.stream().filter(a -> a.length() == 3).limit(3).forEach(System.out::println);// 3、把上述过滤后的男演员姓名和女演员姓名合并到一起List<String> collect = manArray.stream().filter(a -> a.length()==3).limit(3).collect(Collectors.toList());List<String> collect1 =Stream.concat(collect.stream(), womanList.stream()).collect(Collectors.toList());
collect1.stream().forEach(System.out::println);// 4、把上一步操作后的元素作为构造方法的参数创建演员对象,遍}}
单元测试
测试:检查代码有没有bug
黑盒测试:不看代码结构,只看结果
白盒测试:必须要看代码
灰盒测试:能看一部分代码
注:上面的测试是专业人员操作的
单元测试:测试自己写方法,程序员自己测
使用main方法来做,每一个只有一个main,测试很不方便
使用单元测试来代替main
- 需要使用一个@Test的注解
- 第一次使用需要导包
- (重复的代码)需要使用一个@Before或者@After的注解 - @Before:在每个测试方法执行之前要执行方法- @After:在每个测试方法执行之后要执行方法
- 注意:单元测试的方法,不能有返回值,可以抛出Exception
publicclassTestCase{@Test// 单元测试的注解// 单元测试的方法,不能有返回值,可以抛出ExceptionpublicvoidtestDemo1()throwsException{System.out.println("这个单元测试1");}@TestpublicvoidtestDemo2()throwsException{System.out.println("这个单元测试2");}@TestpublicvoidtestDemo3()throwsException{System.out.println("这个单元测试3");}// 在测试方法代码冗余(重复的代码)@Before// 在每个测试方法执行之前要执行方法publicvoidbefore()throwsException{System.out.println("hello");}@Afterpublicvoidafter()throwsException{System.out.println("用来释放锁,关闭流");}}
单例模式
一个类就是只有一个对象,那么就是单例
将一个类设计成单例的方式就是单例模式
怎样将一个类设计为单例
1、私有构造方法
2、在当前类创建对象
3、在该类设计一个类方法,返回这个对象
package cn.itsource.singleton;
/**
* 将Dog设计为单例:饿汉模式
*/
public class Dog {
// 2、创建对象
private static Dog d = new Dog(); // 不管这个对象用不用,在内存中存在
// 省略属性
// 1、私有化构造方法
private Dog() {}
// 3、设计一个类方法,返回创建的对象
public static Dog getInstance() {
return d;
}
}
publicclassSingletonDemo{publicstaticvoidmain(String[] args){Dog d1 =Dog.getInstance();System.out.println(d1);Dog d2 =Dog.getInstance();System.out.println(d2);Dog d3 =Dog.getInstance();System.out.println(d3);}}
版权归原作者 Z皓峻AS 所有, 如有侵权,请联系我们删除。