Java——JUnit、单例设计模式、函数式编程Lambda

一、JUnit

1.1、为什么需要 JUnit

1、一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中

2、如果有多个功能代码测试,就需要来回注销,切换很麻烦

3、如果可以直接运行一个方法,就方便很多,并且可以给出相关信息,就好了->JUnit

1.2、基本介绍

1、JUnit是一个Java语言的单元测试框架

2、多数Java的开发环境都已经集成了JUnit作为单元测试的工具

1.3、使用方法

java 复制代码
import org.junit.Test;
public class JUnit_ {
    public static void main(String[] args) {
        //传统方式
        //new JUnit_().m1();
        //new JUnit_().m2();

    }


    @Test
    public void m1() {
        System.out.println("m1方法被调用");
    }

    @Test
    public void m2() {
        System.out.println("m2方法被调用");
    }

    @Test
    public void m3() {
        System.out.println("m3方法被调用");
    }
}

二、单例设计模式

java 复制代码
public class Test {
    public static void main(String[] args) {
        // 目标:设计单例类。
        A a1 = A.getInstance();
        A a2 = A.getInstance();
        System.out.println(a1);
        System.out.println(a2);
        System.out.println(a1 == a2);

        System.out.println("============================");

        B b1 = B.getInstance();
        B b2 = B.getInstance();
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b1 == b2);
    }
}

2.1、懒汉式

java 复制代码
// 设计成单例设计模式-饿汉式单例类
// 拿对象时,对象已经创立好了
public class A {
    // 2、定义一个静态变量,用于存储本类的一个唯一对象。
    // public static final A a = new A();
    private static A a = new A();
    // private static final A a = new A();

    // 1、私有化构造器: 确保单例类对外不能创建太多对象,单例才有可能性。
    private A() {
    }

    // 3、提供一个公开的静态方法,返回这个类的唯一对象。
    public static A getInstance() {
        return a;
    }
}

2.2、饿汉式

java 复制代码
// 设计成单例设计模式-懒汉式单例类
// 拿对象时,对象可能还没创立好
public class B {
    // 2、私有化静态变量
    private static B b;

    // 1、私有化构造器
    private B() {
    }

    // 3、提供静态方法返回对象: 真正需要对象的时候才开始创建对象。
    public static B getInstance() {
        if (b == null) {
            // 第一次拿对象时,会创建对象,给静态变量b记住。
            b = new B();
        }
        return b;
    }
}

三、函数式编程Lambda表达式

3.1、基本介绍

1、此"函数"类似于数学中的函数 ( 强调做什么 ) ,只要输入的数据一致返回的结果也是一致的

2、函数式编程解决了什么问题?

使用 Lambda 函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。

3、JDK8开始新增的一种语法形式,它表示函数

可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。

(被重写方法的形参列表)->{

被重写方法的方法体代码。

}

3.2、注意事项

1、注意:Lambda 表达式只能替代函数式接口的匿名内部类!!!

2、什么是函数式接口?

有且仅有一个抽象方法的接口。

注意:将来见到的大部分函数式接口,上面都可能会有一个 @Functionallnterface 的注解,该注解用于约束当前接口必须是函数式接口。

3.3、应用

3.3.1、示例1

java 复制代码
public class LambdaDemo1 {
    public static void main(String[] args) {
        // 目标:认识Lambda表达式:搞清楚其基本作用。
        Animal a = new Animal() {
            @Override
            public void cry() {
                System.out.println("🐱是喵喵喵的叫~~~~");
            }
        };
        a.cry();

        // 错误示范:Lambda并不是可以简化全部的匿名内部类,Lambda只能简化函数式接口的匿名内部类。
//        Animal a1 = () -> {
//            System.out.println("🐱是喵喵喵的叫~~~~");
//        };
//        a1.cry();

        System.out.println("=====================================================");

       /* Swim s1 = new Swim() {
            @Override
            public void swimming() {
                System.out.println("学生🏊‍贼快~~~~");
            }
        }; */

        // Lambda只能简化函数式接口的匿名内部类。
        Swim s1 = () -> {
            System.out.println("学生🏊‍贼快~~~~");
        };
        s1.swimming();
    }
}

abstract class Animal{
    public abstract void cry();
}

// 函数式接口:只有一个抽象方法的接口。
@FunctionalInterface // 声明函数式接口的注解。
interface Swim{
    void swimming();
}

3.3.2、示例2

java 复制代码
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    // 姓名 年龄 身高 性别
    private String name;
    private int age;
    private double height;
    private char sex;
}
java 复制代码
import javax.swing.*;
import java.util.Arrays;

public class LamdbaDemo2 {
    public static void main(String[] args) {
        // 目标:用Lambda表达式简化实际示例。
        test1();
        test2();
    }

    public static void test1(){
        Student[] students = new Student[6];
        students[0] = new Student("殷素素", 35, 171.5, '女');
        students[1] = new Student("杨幂", 28, 168.5, '女');
        students[2] = new Student("张无忌", 25, 181.5, '男');
        students[3] = new Student("小昭", 19, 165.5, '女');
        students[4] = new Student("赵敏", 27, 167.5, '女');
        students[5] = new Student("刘亦菲", 36, 168, '女');

        // 需求:按钮年龄升序排序。可以调用sun公司写好的API直接对数组进行排序。
//        Arrays.sort(students, new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o1.getAge() - o2.getAge(); // 按照年龄升序!
//            }
//        });

//        Arrays.sort(students, (Student o1, Student o2) -> {
//            return o1.getAge() - o2.getAge(); // 按照年龄升序!
//        });

//        Arrays.sort(students, (o1,  o2) -> {
//            return o1.getAge() - o2.getAge(); // 按照年龄升序!
//        });

        Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

        // 遍历数组中的学生对象并输出
        for (int i = 0; i < students.length; i++) {
            Student s = students[i];
            System.out.println(s);
        }
    }

    public static void test2(){
        JFrame win = new JFrame("登录窗口");
        win.setSize(300, 200);
        win.setLocationRelativeTo(null); // 居中显示。
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        win.add(panel);

        JButton btn = new JButton("登录");
        panel.add(btn);
        // java要求必须给这个按钮添加一个点击事件监听器对象,这样就可以监听用户的点击操作,就可以做出反应。
        // 开发中不是我们要主动去写匿名内部类,而是用别人的功能的时候,别人可以让我们写一个匿名内部类吗,我们才会写!!
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                System.out.println("登录成功!");
//            }
//        });

//        btn.addActionListener((ActionEvent e) -> {
//                System.out.println("登录成功!");
//        });

//        btn.addActionListener((e) -> {
//            System.out.println("登录成功!");
//        });

//        btn.addActionListener(e -> {
//            System.out.println("登录成功!");
//        });

        btn.addActionListener(e ->  System.out.println("登录成功!"));

        win.setVisible(true);
    }
}
相关推荐
juniperhan9 分钟前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_1800790547310 分钟前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路30 分钟前
C++23概述
java·c++·c++23
专注API从业者1 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY2 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克33 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠3 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌3 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局4 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化