[Java基础]函数式编程

news2025/4/21 19:51:07

Lambda函数

JDK8新增的语法形式, 使用Lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。

基本使用

lambda表达式只能简化函数式接口的匿名内部类写法

// 1.定义抽象类
abstract class Animal {
    public abstract void crt();
}

public class LambdaDome {
    public staitc void main(String[] args) {
       // 2.使用匿名内部类, 创建抽象类的子类对象
       Animal a = new Animal() {
           @Override
           public void cry() {
               sout("猫喵喵的叫")
           }
       }

       // 3. 错误示范, 代码报错
       // lambda表达式并不能简写所有匿名内部类的写法
       Animal a = () -> {
            sout("猫喵喵的叫")
        }
        
       a.cry(); // 猫喵喵的叫
       
    }
}
// 1.定义函数式接口
// 定义: 有且只有一个抽象方法的接口称为函数式接口
// 注解: 约束函数式接口的注解, 不符合要求会报错
@FunctionalInterface
interface Swim {
    void swimming();
}

public class LambdaDome {
    public staitc void main(String[] args) {
       // 2.使用匿名内部类, 创建接口类的子类对象
       Swim a = new Swim() {
           @Override
           public void swimming() {
               sout("老师狗爬式游泳")
           }
       }

       // 3. 使用lambda表达式简化匿名内部类写法
       Swim a = () -> {
            sout("老师狗爬式游泳")
        }
        
       a.swimming(); // 老师狗爬式游泳
       
    }
}
  1. 什么是函数式接口? 有且仅有一个抽象方法的接口。
  2. 大部分函数式接口,上面都会有 @Functionallnterface 注解, 用于约束当前接口必须是函数式接口。

简化规则

用于进一步简化Lambda表达式的写法。

  1. 参数类型全部可以省略不写。
  1. 如果只有一个参数, “()”也可以省略,但多个参数不能省略
  2. 如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”
  3. 如果这行代码是return语句,也必须去掉return。
public class Test {
    public static void main(String[] args) {
        // 需求: 创建一个登录窗口,窗口上有一个登录按钮
        JFrame win = new JFrame("登录窗口");
        win.setSize(300, 200);
        win.setLocationRelativeTo(null); // 居中展示
        win.setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE);

        JPanel penel new JPanel();
        win.add(penel);

        JButton btn = new JButton("登录");
      
        // 2.匿名内部类: 快速创建对象, 传给方法
        // btn.addActionListener(new ActionListener{
        //       public void actionPerfirmed(ActionEvent e) {
        //          sout("按钮点击了")
        //       }
        // });

        // 3. 使用lambda表达式的规则简化语法
        btn.addActionListener(e -> sout("按钮点击了"));

        win.setVisible(true);
    }
}
public class Test {
    public static void main(String[] args) {
        // 需求: 完成数组排序, 加深匿名内部类的使用
        // 1. 准备数组,存放学生对象
        student[] students = new student[4];
        students[0] = new Student( name:"殷素素",age:35,height:171.5,sex:'女');
        students[1] = new Student( name:"杨幂",age:28,height: 168.5,sex:'女');
        students[2] = new student( name:"张无忌"age:25,height:181.5,sex:'男');
        students[3] = new student( name:"刘亦菲",age: 36,height: 168,sex:'女');

        // 2.使用数组的API, 对数组按照对象的年龄升序排序
        // Arrays.sort(students, new Comparator<Student>() {
        //     @Override
        //     public int compare(Student o1, Student o2) {
        //         // 按对象年龄升序排序
        //         return o1.getAge() - o2.getAge();
        //         // 按对象年龄降序排序
        //         return o2.getAge() - o1.getAge();
        //     }
        // });

         //3.使用lambda表达式的规则简化语法
         Arrays.sort(students, (o1,o2) -> o1.getAge() - o2.getAge());
        
        // 3.遍历数组中的对象并输出
        for (int i = 0; i<students.length; i++) {
            student s = students[i];
            sout(s);
        }
        
    }
}

方法引用

进一步简化Lambda表达式, 遇到可以简化场景时使用(IDEA会提示)

静态方法引用

类名::静态方法

如果某个Lambda表达式里只是调用一个静态方法, 并且 "->"前后参数的形式一致, 就可以使用静态方法引用

public class Student {
    private String name;
    private int age;
    private double height;
    private String sex;

    // 提供静态方法
    public static int compareByAge(Student s1, Student s2) {
        return s1.getAge() - s2.getAge()
    }
}

public class Test {
    public static void main(String[] args) {
        // 1. 准备数组,存放学生对象
        student[] students = new student[4];
        students[0] = new Student( name:"殷素素”,age:35,height:171.5,sex:'女');
        students[1] = new Student( name:"杨幂",age:28,height: 168.5,sex:'女');
        students[2] = new student( name:"张无忌"age:25,height:181.5,sex:'男');
        students[3] = new student( name:"刘亦菲",age: 36,height: 168,sex:'女');

        // 2.使用数组的API, 对数组按照对象的年龄升序排序
        // Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

        // 3.使用lambda表达式调用静态方法
        // Arrays.sort(students, (o1, o2) -> Student.compareByAge(o1, o2));

        // 3.使用静态方法引用进一步简化
        Arrays.sort(students, Student::compareByAge);
        
        // 4.遍历数组中的对象并输出
        for (int i = 0; i<students.length; i++) {
            student s = students[i];
            sout(s);
        }
        
    }
}

实例方法引用

对象名::实例方法

如果某个Lambda表达式里只是调用一个实例方法, 并且"->"前后参数的形式一致, 就可以使用实例方法引用

public class Student {
    private String name;
    private int age;
    private double height;
    private String sex;

    // 提供实例方法
    public int compareByAge(Student s1, Student s2) {
        return s1.getAge() - s2.getAge()
    }
}

public class Test {
    public static void main(String[] args) {
        // 1. 准备数组,存放学生对象
        student[] students = new student[4];
        students[0] = new Student( name:"殷素素”,age:35,height:171.5,sex:'女');
        students[1] = new Student( name:"杨幂",age:28,height: 168.5,sex:'女');
        students[2] = new student( name:"张无忌"age:25,height:181.5,sex:'男');
        students[3] = new student( name:"刘亦菲",age: 36,height: 168,sex:'女');

        // 2.使用数组的API, 对数组按照对象的年龄升序排序
        // Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

        // 3.使用lambda表达式调用实例方法
        Student s1 = new Student();
        // Arrays.sort(students, (o1, o2) -> s1.compareByAge(o1,o2));

        // 3.使用实例方法引用进一步简化
        Arrays.sort(students, s1::compareByAge);
        
        // 4.遍历数组中的对象并输出
        for (int i = 0; i<students.length; i++) {
            student s = students[i];
            sout(s);
        }
        
    }
}

特定类型的方法引用

特定类的名称::方法

如果某个Lambda表达式里只是调用一个特定类型的实例方法, 并且前面参数列表中的第一个参数作为方法的主调, 后面的所有参数都是作为该实例方法的入参, 此时可以使用特定类型的方法引用

public class Demo {
    public static void main(String[] args) {
        // 需求:有一个字符申数组,里面有一些人的名字都是,请按照名字的首字母升序排序
         String[] names = {"Tom", "Jerry", "Bobi", "曹操", "Mike", "angela", "Dlei", "Jack", "Rose", "Andy", "caocao"};

        // 1.对数组排序: Arrays.sort(数组, 比较器对象)
        Arrays.sort(names);  // 默认就是按照首字母的编号升序排序
        System.out.println(Arrays.toString(names)); // [Andy, Bobi, Jack, Jerry, Mike, Rose, Tom, angela, caocao, 曹操, Dlei]
        
        // 2.需要忽略首字母的大小写进行升序排序(java官网默认是搞不定的,需要自己指定比较规则)
        Arrays.sort(names, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareToIgnoreCase(o2); // java提供了字符串按照首字母忽略大小写比较的方法
            }
        });
        System.out.println(Arrays.toString(names)); // [Andy, angela, Bobi, caocao, Dlei, Jack, Jerry, Mike, Rose, Tom, 曹操]

        // 3.使用特定类型的方法引用简化代码
        Arrays.sort(names, String::compareToIgnoreCase);
        System.out.println(Arrays.toString(names)); // [Andy, angela, Bobi, caocao, Dlei, Jack, Jerry, Mike, Rose, Tom, 曹操]
        
    }
}

构造器引用

类名::new

如果某个Lambda表达式里只是在创建对象, 并且"->"前后参数情况一致, 就可以使用构造器引用

// 汽车类
class Car {
    private String name;
}

// 函数式接口
@FunctionalInterface
interface CarFactory {
    Car getCar(String name);
}

public class Demo {
    public static void main(String[] args) {
        // 1.创建接口的匿名内部类对象
        CarFactory cf = new CarFactory() {
            @Override
            public Car getCar(String name) {
                return new Car(name);
            }
        }

        // 2.使用lambda表达式简写
        CarFactory cf = name -> new Car(name);

        // 3.构造器引用进一步简化
        CarFactory cf = Car::new;
        
        Car c1 = cf.getCar("奔驰");
        System.out.println(c1); // Car(name=奔驰)
    }
}

Stream流

认识流

Jdk8开始新增的一套API(iava.util.stream.*),可以用于操作集合或者数组的数据

  1. 先得到集合或者数组的Stream流。
  2. 然后调用Stream流的方法对数据进行处理。
  3. 获取处理的结果。

示例代码

public class Dome {
    public static void main(String[] args) {
        // 1.认识stream流的使用
        // 需求: 把集合中所有以“张”开头,且是3个字的元素存储到一个新的集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

        // 2.使用传统方式完成需求
        List<String> newList = new ArrayList<>();
        for (String l : list) {
            if (l.startsWith("张") && l.length() == 3) {
                newList.add(l);
            }
        }
        // [张无忌, 张三丰]
        System.out.println(newList);

        // 3.使用stream流完成需求
        List<String> newList2 = list.stream()
                .filter(l -> l.startsWith("张"))
                .filter(l -> l.length() == 3)
                .collect(Collectors.toList());
        // [张无忌, 张三丰]
        System.out.println(newList2);
    }
}
  1. Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,支持链式编程

获取流

1.获取集合的Stream流

public class Dome2 {
    public static void main(String[] args) {
        // 获取Stream流
        // 1.获取Collection集合流
        // 使用Collection接口提供的stream()方法获取流
        Collection<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();

        // 2.获取Map集合流
        Map<String, Integer> map = new HashMap<>();
        // 获取键流
        Stream<String> s2 = map.keySet().stream();
        // 获取值流
        Stream<Integer> s3 = map.values().stream();
        // 获取键值对流
        Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();
    }
}
2.获取数组的Stream流

public class Dome2 {
    public static void main(String[] args) {
        // 获取Stream流
         String[] arr = {"a", "b", "c", "d"};
        // 3.获取数组流
        // 使用Stream类中的静态方法of()
        Stream<String> s5 = Stream.of(arr);
        // 使用Arrays类中的静态方法stream()
        Stream<String> s6 = Arrays.stream(arr);
    }
}

处理流

中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程),

public class Dome3 {
    public static void main(String[] args) {
        // 使用stream流的中间方法处理数据
        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

        // 1.过滤方法
        list.stream()
                .filter(s -> s.startsWith("张") && s.length() == 3)
                .forEach(System.out::println); // 张无忌, 张三丰

        // 2.排序方法
        List<Double> scores = new ArrayList<>();
        scores.add(99.9);
        scores.add(66.1);
        scores.add(88.7);
        scores.add(66.1);
        scores.add(72.3);
        scores.add(88.7);
        // 默认是升序排序  66.1 72.3 88.7 99.9
        scores.stream()
                .sorted()
                .forEach(System.out::println);
        // 指定排序规则(降序) 99.9 88.7 72.3 66.1
        scores.stream()
                .sorted((o1, o2) -> Double.compare(o2, o1))
                .forEach(System.out::println);

        // 3.截取方法,
        // 只要前3名 99.9 88.7 72.3
        scores.stream()
                .sorted((o1, o2) -> Double.compare(o2, o1))
                .limit(3)
                .forEach(System.out::println);
        // 跳过前2名 72.3 66.1
        scores.stream()
                .sorted((o1, o2) -> Double.compare(o2, o1))
                .skip(2)
                .forEach(System.out::println);

        // 4.去重方法 99.9 66.1 88.7 72.3
        // 如果自定义对象需要去重, 该对象必须重写hashCode和equals方法
        scores.stream()
                .distinct()
                .forEach(System.out::println);

        // 5.映射/加工方法: 把流里面的元素进行加工, 得到新的集合
        // 成绩是:99.9分 成绩是:66.1分 成绩是:88.7分 成绩是:66.1分 成绩是:72.3分 成绩是:88.7分
        scores.stream()
                .map(s -> "成绩是:" + s + "分")
                .forEach(System.out::println);

        // 6.合并流
        Stream<String> s1 = Stream.of("张无忌", "赵敏", "张三丰");
        Stream<Integer> s2 = Stream.of(11, 22, 31);
        Stream<Object> s3 = Stream.concat(s1, s2);
        System.out.println(s3.count()); // 6
    }
}

终结流

使用Stream是为了方便的操作集合和数组, 操作完成后把结果收集到数组或集合中, 才是最终的目的

  1. 终结流

  • 补充: Optional容器中的元素需要通过get()方法获取出来

  1. 收集流

代码示例

public class Teacher {
    private String name;
    private int age;
    private double salary;

    //... 省略构造器和get/set方法 ...

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}' + '\n';
    }
}
public class Dome4 {
    public static void main(String[] args) {
        // 掌握终结Stream流的方法
        List<Teacher> list = List.of(
                new Teacher("张三", 18, 5000),
                new Teacher("李四", 28, 6000),
                new Teacher("王五", 38, 7000),
                new Teacher("赵六", 48, 8000)
        );
        // 1.遍历终结
        // Teacher{name='王五', age=38, salary=7000.0} Teacher{name='赵六', age=48, salary=8000.0}
        list.stream().filter(t -> t.getSalary() > 6000).forEach(System.out::println);

        // 2.获取结果数量
        long count = list.stream().filter(t -> t.getSalary() > 6000).count();
        System.out.println(count); // 2

        // 3.获取最大值 (根据工资)
        Teacher max = list.stream().max(Comparator.comparing(Teacher::getSalary)).get();
        System.out.println(max); // Teacher{name='赵六', age=48, salary=8000.0}

        // 4.获取最小值 (根据年龄)
        Teacher min = list.stream().min(Comparator.comparing(Teacher::getAge)).get();
        System.out.println(min); // Teacher{name='张三', age=18, salary=5000.0}

    }
}
public class Dome5 {
    public static void main(String[] args) {
        // 掌握收集Stream流的方法
        List<Teacher> list = List.of(
                new Teacher("张三", 18, 5000),
                new Teacher("李四", 28, 6000),
                new Teacher("王五", 38, 7000),
                new Teacher("赵六", 48, 8000)
        );

        // 1. 把流收集到list集合中
        List<Teacher> list1 = list.stream().
                filter(s -> s.getName().startsWith("张")).
                collect(Collectors.toList());
        System.out.println(list1); // [Teacher{name='张三', age=18, salary=5000.0}]

        // 2. 把流收集到set集合中
        Set<Teacher> list2 = list.stream().
                filter(s -> s.getName().startsWith("张"))
                .collect(Collectors.toSet());
        System.out.println(list2);// [Teacher{name='张三', age=18, salary=5000.0}]

        // 3. 把流收集到数组中
        Object[] list3 = list.stream()
                .filter(s -> s.getName().startsWith("张"))
                .toArray();
        System.out.println(Arrays.toString(list3)); // [Teacher{name='张三', age=18, salary=5000.0}]

        // 4. 把流收集到Map集合中: 键是老师的名字, 值是老师的薪水
        // 4.1完整写法
//        Map<String, Double> map = list.stream().collect(Collectors.toMap(new Function<Teacher, String>() {
//            @Override
//            public String apply(Teacher teacher) {
//                return teacher.getName();
//            }
//        }, new Function<Teacher, Double>() {
//            @Override
//            public Double apply(Teacher teacher) {
//                return teacher.getSalary();
//            }
//        }));
        
        // 4.2lambda简写
//        Map<String, Double> map = list.stream().
//                collect(Collectors.toMap(teacher -> teacher.getName(), teacher -> teacher.getSalary()));
        
        // 4.3方法引用简写
        Map<String, Double> map = list.stream().
                collect(Collectors.toMap(Teacher::getName, Teacher::getSalary));

        System.out.println(map); // {李四=6000.0, 张三=5000.0, 王五=7000.0, 赵六=8000.0}
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 零拷贝技术

一、传统做法&#xff0c;经历“四次拷贝” 数据 1.读取到内核缓冲区 2.拷贝到用户缓冲区 3.写入到内核缓冲区 4.拷贝到网卡 使用 DMA&#xff0c;减少2次拷贝&#xff0c;还剩2次拷贝 DMA 负责硬盘到内核缓冲区和内核到网卡的传输。 CPU 仍需处理内核和用户缓冲区之间的数据…

【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)

文章目录 0 DeepSeek系列总览1 模型架构设计基本参数专家混合模型&#xff08;MoE&#xff09;[DeepSeek-V2提出, DeepSeek-V3改良]多头潜在注意力&#xff08;MLA&#xff09;[DeepSeek-V2提出]多token预测&#xff08;MTP&#xff09;[DeepSeek-V3提出] 2 DeepSeek-R1-Zero及…

数据结构(1)——算法时间复杂度与空间复杂度

目录 前言 一、算法 1.1算法是什么&#xff1f; 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码&#xff0c;一步一步来 第一步&#xff1a; 找到根目录下的 pages.json 文件&#xff0c;在 tabBar 中把 custom 设置为 true&#xff0c;默认值是 false。list 中设置自定义的相关信息&#xff0c; pagePath&#x…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

DeepSeek-VL2论文解读:用于高级多模态理解的专家混合视觉语言模型

github:https://github.com/deepseek-ai/DeepSeek-VL2 paper: https://github.com/deepseek-ai/DeepSeek-VL2/blob/main/DeepSeek_VL2_paper.pdf 大型视觉语言模型&#xff08;VLMs&#xff09;已经成为人工智能领域的变革性力量&#xff0c;将大型语言模型&#xff08;LLMs&…

第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)

引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码&#xff0c;在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码&#xff0c;进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…

Day37-【13003】短文,串的基本概念,匹配算法,算法时间复杂度,真题训练

文章目录 第二节 串串的基本概念串的模式匹配朴素的模式匹配算法(BF算法)算法最坏时间复杂度O(n x m) 改进的模式匹配算法(KMP算法)特征向量next&#xff0c;来确定k值特征向量next的算法实现 算法最坏时间复杂度O(n)进一步改进next值的计算&#xff0c;简化步骤 第四章真题真题…

陷入闭包:理解 React 状态管理中的怪癖

TLDR 闭包就像函数随身携带的背包&#xff0c;包含它们创建时的数据React 组件使用闭包来记住它们的状态和属性过时的闭包可能导致状态更新不如预期时的错误函数式更新提供了一个可靠的方式来处理最新状态 简介 你是否曾经疑惑过&#xff0c;为什么有时你的 React 状态更新不…

【SRC排名】安全应急响应中心SRC上榜记录

2023年 新氧第三 https://security.soyoung.com/top 合合第四 https://security.intsig.com/index.php?m&chall&aindex 2024年 好未来第一 https://src.100tal.com/index.php?m&chall&aindex&#xff08;官网是总榜&#xff0c;年榜只有海报&#xff09;…

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…

OSPF基础(1):工作过程、状态机、更新

OSPF基础 1、技术背景&#xff08;与RIP密不可分&#xff0c;因为RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网周期性发送全部路由信息&#xff0c;占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库&#xff08;如 sklearn、pan…

Unity 2D实战小游戏开发跳跳鸟 - 计分逻辑开发

上文对障碍物的碰撞逻辑进行了开发,接下来就是进行跳跳鸟成功穿越过障碍物进行计分的逻辑开发,同时将对应的分数以UI的形式显示告诉玩家。 计分逻辑 在跳跳鸟通过障碍物的一瞬间就进行一次计分,计分后会同步更新分数的UI显示来告知玩家当前获得的分数。 首先我们创建一个用…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准&#xff1a;NTP卫星时钟服务器对于DeepSeek安全的重要性 京准&#xff1a;NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…

车型检测7种YOLOV8

车型检测7种YOLOV8&#xff0c;采用YOLOV8NANO训练&#xff0c;得到PT模型&#xff0c;转换成ONNX&#xff0c;然后OPENCV的DNN调用&#xff0c;支持C&#xff0c;python,android开发 车型检测7种YOLOV8

IDEA 中集成 Maven,配置环境、创建以及导入项目

目录 在 IntelliJ IDEA 中集成 Maven 并配置环境 1. 打开 IDEA 设置 2. 定位 Maven 配置选项 3. 配置 Maven 路径 4. 应用配置 创建 Maven 项目 1. 新建项目 2. 选择项目类型 3. 配置项目信息 4. 确认 Maven 设置 5. 完成项目创建 导入 Maven 项目 1. 打开导入窗口…

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码&#xff0c;代码里面都有注释&#xff0c;我是单独写了一个组件&#xff0c;方便使用&#xff0c;在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统

大数据项目-Django基于大数据实现的心血管疾病分析系统背景可以从以下几个方面进行阐述&#xff1a; 一、项目背景与意义 1. 心血管疾病现状 心血管疾病是当前全球面临的主要健康挑战之一&#xff0c;其高发病率、高致残率和高死亡率严重威胁着人类的生命健康。根据权威机构…