0


Lambda方法引用&Stream流&单元测试&单例模式

总结

  • 回顾接口可存放:​ 常量 ​ 抽象方法 ​ 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);}}

本文转载自: https://blog.csdn.net/ZWJAS/article/details/135302021
版权归原作者 Z皓峻AS 所有, 如有侵权,请联系我们删除。

“Lambda方法引用&Stream流&单元测试&单例模式”的评论:

还没有评论