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);
    }
}
相关推荐
OxYGC16 分钟前
[AI工程] Spring AI 第十四篇:Agent 五种模式在 2.0 里怎么写
java·spring·ai·ai编程
code2cat17 分钟前
【随笔】从聊天到调用工具:理解MCP在AI应用中的位置
java·人工智能
2501_9339232525 分钟前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
学编程就要猛42 分钟前
基于Spring AI 的智能聊天机器人
java·spring ai·chat robot
修炼室1 小时前
Java开发工程师笔试经验贴【高频知识】
java
木井巳1 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
杨杨杨大侠1 小时前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信1 小时前
Spring AI 基础学习与应用
java·后端
夜郎king1 小时前
基于 Java + Playwright 实现网站自动访问与数据采集(以腾讯云开发者社区为例)
java·playwright·网页数据获取
Anastasiozzzz1 小时前
重新定义 Agent 基建:Redis 在现代 AI 与智能体系统中的工程实践
java·人工智能·redis·ai