当前位置: 首页 > news >正文

11.streamFile

1.Stream流

1.1体验Stream流【理解】

  • 案例需求

    按照下面的要求完成集合的创建和遍历

    • 创建一个集合,存储多个字符串元素
    • 把集合中所有以"张"开头的元素存储到一个新的集合
    • 把"张"开头的集合中的长度为3的元素存储到一个新的集合
    • 遍历上一步得到的集合
  • 原始方式示例代码

    public class MyStream1 {public static void main(String[] args) {//集合的批量添加ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));//list.add()//遍历list1把以张开头的元素添加到list2中。ArrayList<String> list2 = new ArrayList<>();for (String s : list1) {if(s.startsWith("张")){list2.add(s);}}//遍历list2集合,把其中长度为3的元素,再添加到list3中。ArrayList<String> list3 = new ArrayList<>();for (String s : list2) {if(s.length() == 3){list3.add(s);}}for (String s : list3) {System.out.println(s);}      }
    }
    
  • 使用Stream流示例代码

    public class StreamDemo {public static void main(String[] args) {//集合的批量添加ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));//Stream流list1.stream().filter(s->s.startsWith("张")).filter(s->s.length() == 3).forEach(s-> System.out.println(s));}
    }
    
  • Stream流的好处

    • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印
    • Stream流把真正的函数式编程风格引入到Java中
    • 代码简洁

1.2Stream流的常见生成方式【应用】

  • Stream流的思想

    在这里插入图片描述

  • Stream流的三类方法

    • 获取Stream流
      • 创建一条流水线,并把数据放到流水线上准备进行操作
    • 中间方法
      • 流水线上的操作
      • 一次操作完毕之后,还可以继续进行其他操作
    • 终结方法
      • 一个Stream流只能有一个终结方法
      • 是流水线上的最后一个操作
  • 生成Stream流的方式

    • Collection体系集合

      使用默认方法stream()生成流, default Stream stream()

    • Map体系集合

      把Map转成Set集合,间接的生成流

    • 数组

      通过Arrays中的静态方法stream生成流

    • 同种数据类型的多个数据

      通过Stream接口的静态方法of(T… values)生成流

  • 代码演示

    public class StreamDemo {public static void main(String[] args) {//Collection体系的集合可以使用默认方法stream()生成流List<String> list = new ArrayList<String>();Stream<String> listStream = list.stream();Set<String> set = new HashSet<String>();Stream<String> setStream = set.stream();//Map体系的集合间接的生成流Map<String,Integer> map = new HashMap<String, Integer>();Stream<String> keyStream = map.keySet().stream();Stream<Integer> valueStream = map.values().stream();Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();//数组可以通过Arrays中的静态方法stream生成流String[] strArray = {"hello","world","java"};Stream<String> strArrayStream = Arrays.stream(strArray);//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");Stream<Integer> intStream = Stream.of(10, 20, 30);}
    }
    

1.3Stream流中间操作方法【应用】

  • 概念

    中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

  • 常见方法

    方法名说明
    Stream filter(Predicate predicate)用于对流中的数据进行过滤
    Stream limit(long maxSize)返回此流中的元素组成的流,截取前指定参数个数的数据
    Stream skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流
    static Stream concat(Stream a, Stream b)合并a和b两个流为一个流
    Stream distinct()返回由该流的不同元素(根据Object.equals(Object) )组成的流
  • filter代码演示

    public class MyStream3 {public static void main(String[] args) {
    //        Stream<T> filter(Predicate predicate):过滤
    //        Predicate接口中的方法	boolean test(T t):对给定的参数进行判断,返回一个布尔值ArrayList<String> list = new ArrayList<>();list.add("张三丰");list.add("张无忌");list.add("张翠山");list.add("王二麻子");list.add("张良");list.add("谢广坤");//filter方法获取流中的 每一个数据.//而test方法中的s,就依次表示流中的每一个数据.//我们只要在test方法中对s进行判断就可以了.//如果判断的结果为true,则当前的数据留下//如果判断的结果为false,则当前数据就不要.
    //        list.stream().filter(
    //                new Predicate<String>() {
    //                    @Override
    //                    public boolean test(String s) {
    //                        boolean result = s.startsWith("张");
    //                        return result;
    //                    }
    //                }
    //        ).forEach(s-> System.out.println(s));//因为Predicate接口中只有一个抽象方法test//所以我们可以使用lambda表达式来简化
    //        list.stream().filter(
    //                (String s)->{
    //                    boolean result = s.startsWith("张");
    //                        return result;
    //                }
    //        ).forEach(s-> System.out.println(s));list.stream().filter(s ->s.startsWith("张")).forEach(s-> System.out.println(s));}
    }
    
  • limit&skip代码演示

    public class StreamDemo02 {public static void main(String[] args) {//创建一个集合,存储多个字符串元素ArrayList<String> list = new ArrayList<String>();list.add("林青霞");list.add("张曼玉");list.add("王祖贤");list.add("柳岩");list.add("张敏");list.add("张无忌");//需求1:取前3个数据在控制台输出list.stream().limit(3).forEach(s-> System.out.println(s));System.out.println("--------");//需求2:跳过3个元素,把剩下的元素在控制台输出list.stream().skip(3).forEach(s-> System.out.println(s));System.out.println("--------");//需求3:跳过2个元素,把剩下的元素中前2个在控制台输出list.stream().skip(2).limit(2).forEach(s-> System.out.println(s));}
    }
    
  • concat&distinct代码演示

    public class StreamDemo03 {public static void main(String[] args) {//创建一个集合,存储多个字符串元素ArrayList<String> list = new ArrayList<String>();list.add("林青霞");list.add("张曼玉");list.add("王祖贤");list.add("柳岩");list.add("张敏");list.add("张无忌");//需求1:取前4个数据组成一个流Stream<String> s1 = list.stream().limit(4);//需求2:跳过2个数据组成一个流Stream<String> s2 = list.stream().skip(2);//需求3:合并需求1和需求2得到的流,并把结果在控制台输出
    //        Stream.concat(s1,s2).forEach(s-> System.out.println(s));//需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s));}
    }
    

1.4Stream流终结操作方法【应用】

  • 概念

    终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

  • 常见方法

    方法名说明
    void forEach(Consumer action)对此流的每个元素执行操作
    long count()返回此流中的元素数
  • 代码演示

    public class MyStream5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三丰");list.add("张无忌");list.add("张翠山");list.add("王二麻子");list.add("张良");list.add("谢广坤");//method1(list);//        long count():返回此流中的元素数long count = list.stream().count();System.out.println(count);}private static void method1(ArrayList<String> list) {//  void forEach(Consumer action):对此流的每个元素执行操作//  Consumer接口中的方法void accept(T t):对给定的参数执行此操作//在forEach方法的底层,会循环获取到流中的每一个数据.//并循环调用accept方法,并把每一个数据传递给accept方法//s就依次表示了流中的每一个数据.//所以,我们只要在accept方法中,写上处理的业务逻辑就可以了.list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});System.out.println("====================");//lambda表达式的简化格式//是因为Consumer接口中,只有一个accept方法list.stream().forEach((String s)->{System.out.println(s);});System.out.println("====================");//lambda表达式还是可以进一步简化的.list.stream().forEach(s->System.out.println(s));}
    }
    

1.5Stream流的收集操作【应用】

  • 概念

    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

  • 常用方法

    方法名说明
    R collect(Collector collector)把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式

    方法名说明
    public static Collector toList()把元素收集到List集合中
    public static Collector toSet()把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中
  • 代码演示

    // toList和toSet方法演示 
    public class MyStream7 {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();for (int i = 1; i <= 10; i++) {list1.add(i);}list1.add(10);list1.add(10);list1.add(10);list1.add(10);list1.add(10);//filter负责过滤数据的.//collect负责收集数据.//获取流中剩余的数据,但是他不负责创建容器,也不负责把数据添加到容器中.//Collectors.toList() : 在底层会创建一个List集合.并把所有的数据添加到List集合中.List<Integer> list = list1.stream().filter(number -> number % 2 == 0).collect(Collectors.toList());System.out.println(list);Set<Integer> set = list1.stream().filter(number -> number % 2 == 0).collect(Collectors.toSet());System.out.println(set);
    }
    }
    /**
    Stream流的收集方法 toMap方法演示
    创建一个ArrayList集合,并添加以下字符串。字符串中前面是姓名,后面是年龄
    "zhangsan,23"
    "lisi,24"
    "wangwu,25"
    保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
    */
    public class MyStream8 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("zhangsan,23");list.add("lisi,24");list.add("wangwu,25");Map<String, Integer> map = list.stream().filter(s -> {String[] split = s.split(",");int age = Integer.parseInt(split[1]);return age >= 24;}//   collect方法只能获取到流中剩余的每一个数据.//在底层不能创建容器,也不能把数据添加到容器当中//Collectors.toMap 创建一个map集合并将数据添加到集合当中// s 依次表示流中的每一个数据//第一个lambda表达式就是如何获取到Map中的键//第二个lambda表达式就是如何获取Map中的值).collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1]) ));System.out.println(map);}
    }
    

1.6Stream流综合练习【应用】

  • 案例需求

    现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作

    • 男演员只要名字为3个字的前三人
    • 女演员只要姓林的,并且不要第一个
    • 把过滤后的男演员姓名和女演员姓名合并到一起
    • 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

    演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法

  • 代码实现

    演员类

    public class Actor {private String name;public Actor(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
    }
    

    测试类

    public class StreamTest {public static void main(String[] args) {//创建集合ArrayList<String> manList = new ArrayList<String>();manList.add("周润发");manList.add("成龙");manList.add("刘德华");manList.add("吴京");manList.add("周星驰");manList.add("李连杰");ArrayList<String> womanList = new ArrayList<String>();womanList.add("林心如");womanList.add("张曼玉");womanList.add("林青霞");womanList.add("柳岩");womanList.add("林志玲");womanList.add("王祖贤");//男演员只要名字为3个字的前三人Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);//女演员只要姓林的,并且不要第一个Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);//把过滤后的男演员姓名和女演员姓名合并到一起Stream<String> stream = Stream.concat(manStream, womanStream);// 将流中的数据封装成Actor对象之后打印stream.forEach(name -> {Actor actor = new Actor(name);System.out.println(actor);}); }
    }
    

2.File类

2.1File类概述和构造方法【应用】

  • File类介绍

    • 它是文件和目录路径名的抽象表示
    • 文件和目录是可以通过File封装成对象的
    • 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的
  • File类的构造方法

    方法名说明
    File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
    File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例
    File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例
  • 示例代码

    public class FileDemo01 {public static void main(String[] args) {//File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例File f1 = new File("E:\\itcast\\java.txt");System.out.println(f1);//File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的 File实例File f2 = new File("E:\\itcast","java.txt");System.out.println(f2);//File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的 File实例File f3 = new File("E:\\itcast");File f4 = new File(f3,"java.txt");System.out.println(f4);}
    }
    

2.2绝对路径和相对路径【理解】

  • 绝对路径

    是一个完整的路径,从盘符开始

  • 相对路径

    是一个简化的路径,相对当前项目下的路径

  • 示例代码

    public class FileDemo02 {public static void main(String[] args) {// 是一个完整的路径,从盘符开始File file1 = new File("D:\\itheima\\a.txt");// 是一个简化的路径,从当前项目根目录开始File file2 = new File("a.txt");File file3 = new File("模块名\\a.txt");}
    }
    

2.3File类创建功能【应用】

  • 方法分类

    方法名说明
    public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
    public boolean mkdir()创建由此抽象路径名命名的目录
    public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
  • 示例代码.4File类删除功能【应用】

    public class FileDemo02 {public static void main(String[] args) throws IOException {//需求1:我要在E:\\itcast目录下创建一个文件java.txtFile f1 = new File("E:\\itcast\\java.txt");System.out.println(f1.createNewFile());System.out.println("--------");//需求2:我要在E:\\itcast目录下创建一个目录JavaSEFile f2 = new File("E:\\itcast\\JavaSE");System.out.println(f2.mkdir());System.out.println("--------");//需求3:我要在E:\\itcast目录下创建一个多级目录JavaWEB\\HTMLFile f3 = new File("E:\\itcast\\JavaWEB\\HTML");
    //        System.out.println(f3.mkdir());System.out.println(f3.mkdirs());System.out.println("--------");//需求4:我要在E:\\itcast目录下创建一个文件javase.txtFile f4 = new File("E:\\itcast\\javase.txt");
    //        System.out.println(f4.mkdir());System.out.println(f4.createNewFile());}
    }
    

2.4File类删除功能【应用】

  • 方法分类

    方法名说明
    public boolean delete()删除由此抽象路径名表示的文件或目录
  • 示例代码

    public class FileDemo03 {public static void main(String[] args) throws IOException {
    //        File f1 = new File("E:\\itcast\\java.txt");//需求1:在当前模块目录下创建java.txt文件File f1 = new File("myFile\\java.txt");
    //        System.out.println(f1.createNewFile());//需求2:删除当前模块目录下的java.txt文件System.out.println(f1.delete());System.out.println("--------");//需求3:在当前模块目录下创建itcast目录File f2 = new File("myFile\\itcast");
    //        System.out.println(f2.mkdir());//需求4:删除当前模块目录下的itcast目录System.out.println(f2.delete());System.out.println("--------");//需求5:在当前模块下创建一个目录itcast,然后在该目录下创建一个文件java.txtFile f3 = new File("myFile\\itcast");
    //        System.out.println(f3.mkdir());File f4 = new File("myFile\\itcast\\java.txt");
    //        System.out.println(f4.createNewFile());//需求6:删除当前模块下的目录itcastSystem.out.println(f4.delete());System.out.println(f3.delete());}
    }
    

2.5File类判断和获取功能【应用】

  • 判断功能

    方法名说明
    public boolean isDirectory()测试此抽象路径名表示的File是否为目录
    public boolean isFile()测试此抽象路径名表示的File是否为文件
    public boolean exists()测试此抽象路径名表示的File是否存在
  • 获取功能

    方法名说明
    public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
    public String getPath()将此抽象路径名转换为路径名字符串
    public String getName()返回由此抽象路径名表示的文件或目录的名称
    public File[] listFiles()返回此抽象路径名表示的目录中的文件和目录的File对象数组
  • 示例代码

    public class FileDemo04 {public static void main(String[] args) {//创建一个File对象File f = new File("myFile\\java.txt");//        public boolean isDirectory():测试此抽象路径名表示的File是否为目录
    //        public boolean isFile():测试此抽象路径名表示的File是否为文件
    //        public boolean exists():测试此抽象路径名表示的File是否存在System.out.println(f.isDirectory());System.out.println(f.isFile());System.out.println(f.exists());//        public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
    //        public String getPath():将此抽象路径名转换为路径名字符串
    //        public String getName():返回由此抽象路径名表示的文件或目录的名称System.out.println(f.getAbsolutePath());System.out.println(f.getPath());System.out.println(f.getName());System.out.println("--------");//        public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组File f2 = new File("E:\\itcast");File[] fileArray = f2.listFiles();for(File file : fileArray) {
    //            System.out.println(file);
    //            System.out.println(file.getName());if(file.isFile()) {System.out.println(file.getName());}}}
    }
    

2.6File类练习一【应用】

  • 案例需求

    在当前模块下的aaa文件夹中创建一个a.txt文件

  • 实现步骤

    • 创建File对象,指向aaa文件夹
    • 判断aaa文件夹是否存在,如果不存在则创建
    • 创建File对象,指向aaa文件夹下的a.txt文件
    • 创建这个文件
  • 代码实现

    public class Test1 {public static void main(String[] args) throws IOException {//练习一:在当前模块下的aaa文件夹中创建一个a.txt文件/* File file = new File("filemodule\\aaa\\a.txt");file.createNewFile();*///注意点:文件所在的文件夹必须要存在.//1.创建File对象,指向aaa文件夹File file = new File("filemodule\\aaa");//2.判断aaa文件夹是否存在,如果不存在则创建if(!file.exists()){//如果文件夹不存在,就创建出来file.mkdirs();}//3.创建File对象,指向aaa文件夹下的a.txt文件File newFile = new File(file,"a.txt");//4.创建这个文件newFile.createNewFile();}
    }
    

2.7File类练习二【应用】

  • 案例需求

    删除一个多级文件夹

  • 实现步骤

    • 定义一个方法,接收一个File对象
    • 遍历这个File对象,获取它下边的每个文件和文件夹对象
    • 判断当前遍历到的File对象是文件还是文件夹
    • 如果是文件,直接删除
    • 如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递
    • 参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹
  • 代码实现

    public class Test2 {public static void main(String[] args) {//练习二:删除一个多级文件夹//delete方法//只能删除文件和空文件夹.//如果现在要删除一个有内容的文件夹?//先删掉这个文件夹里面所有的内容.//最后再删除这个文件夹File src = new File("C:\\Users\\apple\\Desktop\\src");deleteDir(src);}//1.定义一个方法,接收一个File对象private static void deleteDir(File src) {//先删掉这个文件夹里面所有的内容.//递归 方法在方法体中自己调用自己.//注意: 可以解决所有文件夹和递归相结合的题目//2.遍历这个File对象,获取它下边的每个文件和文件夹对象File[] files = src.listFiles();//3.判断当前遍历到的File对象是文件还是文件夹for (File file : files) {//4.如果是文件,直接删除if(file.isFile()){file.delete();}else{//5.如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递deleteDir(file);//参数一定要是src文件夹里面的文件夹File对象}}//6.参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹src.delete();}}
    

2.8File类练习三【应用】

  • 案例需求

    统计一个文件夹中每种文件的个数并打印

    打印格式如下:

      		txt:3个doc:4个jpg:6个…
    
  • 实现步骤

    • 定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
    • 遍历File对象,获取它下边的每一个文件和文件夹对象
    • 判断当前File对象是文件还是文件夹
    • 如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
      • 没出现过,将这种类型文件的后缀名存入集合中,次数存1
      • 出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
    • 如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象
  • 代码实现

    public class Test3 {public static void main(String[] args) {//统计一个文件夹中,每种文件出现的次数.//统计 --- 定义一个变量用来统计. ---- 弊端:同时只能统计一种文件//利用map集合进行数据统计,键 --- 文件后缀名  值 ----  次数File file = new File("filemodule");HashMap<String, Integer> hm = new HashMap<>();getCount(hm, file);System.out.println(hm);}//1.定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹private static void getCount(HashMap<String, Integer> hm, File file) {//2.遍历File对象,获取它下边的每一个文件和文件夹对象File[] files = file.listFiles();for (File f : files) {//3.判断当前File对象是文件还是文件夹if(f.isFile()){//如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过String fileName = f.getName();String[] fileNameArr = fileName.split("\\.");if(fileNameArr.length == 2){String fileEndName = fileNameArr[1];if(hm.containsKey(fileEndName)){//出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中Integer count = hm.get(fileEndName);//这种文件又出现了一次.count++;//把已经出现的次数给覆盖掉.hm.put(fileEndName,count);}else{// 没出现过,将这种类型文件的后缀名存入集合中,次数存1hm.put(fileEndName,1);}}}else{//如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象代码实现getCount(hm,f);}}}}
    

相关文章:

11.streamFile

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…...

如何裁剪图片大小尺寸?

如何裁剪图片大小尺寸&#xff1f;平时我们在工作或者学习的时候&#xff0c;会经常需要将图片上传到不同的网站或者平台上&#xff0c;然而上传的时候经常会受到尺寸的限制&#xff0c;有时候尺寸太大就需要变小&#xff0c;为了确保上传成功&#xff0c;我们需要将图片进行裁…...

深度学习笔记之梯度下降、反向传播与内置优化器

文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记&#xff1a; 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…...

Visual Studio 2022 搭建GLFW OpenGL开发环境

最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…...

四元数快速入门【Quaternion】

四元数&#xff08;Quaternion&#xff09;是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述&#xff0c;以帮助理解在空间导航等应用程序中对四元数的需求。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …...

为什么我们要使用向量化运算

问题背景 如果你是matlab用户&#xff0c;你一般都会使用向量化运算进行编程。原因也许很简单&#xff0c;因为matlab针对向量化运算在底层做了深度优化&#xff0c;尤其是针对矩阵乘法调用了MKL之类的高度优化的第三库来加速。所以我们在推演算法的阶段&#xff0c;尽量的以向…...

Makefile零基础教学(一)初识makefile

从这篇文章开始就开始进入 Makefile 的零基础教程&#xff0c;相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。 文章目录 一、什么是 Makefile&#xff0c;优点&#xff1f;二、什么是 make, 为什么使用make?…...

如何使用SpringMVC之常用注解

❣️关注专栏&#xff1a;JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …...

Vue3的axios请求封装,请求拦截,相应拦截

对于三者放在Service.js中封装&#xff0c;方便使用 axios.create 的作用是创建一个新的 axios 实例&#xff0c;该实例可以具有自定义配置。通过使用 axios.create&#xff0c;您可以为任何 API 生成一个客户端&#xff0c;并在使用同一客户端的任何调用中重复使用相同的配置…...

ZC706P试验PL_DDR3内存条的步骤方法

ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条&#xff0c;这个片BLOG我提供从官方下载的一个文档和一个项目&#xff0c;演示一下验证DDR3的步骤。 步骤1&#xff1a;准备好板子&#xff0c;安装好软件。 链接&#xff1a;https://pan.baidu.com/s…...

通达信W底形态选股公式,也称双底形态

W底形态&#xff0c;也称双底形态&#xff0c;是一种经典的技术分析形态&#xff0c;代表了跌势的逆转。看起来像字母 "W"&#xff0c;描述了一波下跌&#xff0c;反弹&#xff0c;再次下跌到与上一波下跌相同或相近的位置&#xff0c;最后是另一波反弹。W底形态两次…...

java语言与算法、数据结构的用法

Java语言是一种广泛使用的计算机编程语言&#xff0c;也是开发各种软件和操作系统的重要工具之一。除了具有高效性和可移植性之外&#xff0c;Java语言还具有丰富的算法和数据结构支持&#xff0c;可以帮助程序员轻松地解决各种问题。 算法和数据结构是计算机科学中的两个基本…...

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿

作为金融领域从业人员时刻都在关注行业最新资讯&#xff0c;只有掌握一手的前沿讯息&#xff0c;才能在职场上无往不胜。针对在职的你&#xff0c;如何利用业余时间让自己更增值呢&#xff0c;中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…...

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件&#xff0c;我们就可以将其应用到其他模型上面了。最简单的方式就是&#xff0c;我们可以给其他模型编辑动画控制器的时候&#xff0c;使用这些动画文件。Unity则给我们提供了更加高级的共享方式&#xff0c;就…...

vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

xlsx xlsx是由SheetJS开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件&#xff0c;突出其应用语言&#xff0c;该库通常又被称为js-xlsx 导出js数据为Excel文件 需要以下步骤&#xff1a; 安装 xlsx 库 你可以使用 …...

java 线程池

线程池 是 一个 容器&#xff0c;其中管理着多个线程&#xff08;预先创建并维护一定数量的线程&#xff09;&#xff0c;当有一个任务a需要一个线程去完成时&#xff0c;从容器&#xff08;线程池&#xff09;中获取一个线程A去执行任务a,当线程A完成任务a后&#xff0c;线程A…...

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念&#xff1f; 在Android音频领域中&#xff0c;应用层所有的App播放音频&#xff0c;最终都是走到音频回播线程PlaybackThread中&#xff0c;如果多个App都走到同一个PlaybackThread中去&#xff0…...

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递

本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件…...

2.0 Vue框架设计的核心要素

本章主要讲解&#xff0c;一个好的框架在构建的时候&#xff0c;需要考虑到的要素&#xff0c;包含报错信息反馈、警告信息反馈、减少打包体积、良好的输出、特性开关&#xff08;兼容&#xff09;等 1、提升用户开发体验 提升用户开发体验主要体现在用户使用框架进行开发时&…...

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志&#xff0c;为国民经济提供重要的终端产品支持&#xff0c;相比较大化工产品&#xff0c;精细化工产品需要高度专业技能和工艺&#xff0c;其生产过程需要复杂的化学反应&#xff0c;以及严格的控制条件&#xff0c;产出的…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...