Java——lambda表达式和StreamAPI

一、lambda

1. lambda表达式

1.1 Lambda表达式的使用举例:

  • (o1,02)->Integer.compare(o1,o2);

1.2 Lambda表达式的格式举例:

  • Lambda形参列表->lambda

1.3 Lambda表达式的格式

lambda操作符或箭头操作符

  • 的左边:lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。
  • 的右边:lambda体,对应着接口的实现类要重写的方法的方法体。

1.4 Lambda表达式的本质

  • 一方面,lambda表达式作为接口的实现类的对象。--->"万事万物皆对象
  • 另一方面,lambda表达式是一个匿名函数。

lambda使用格式实例

    //lambda表达式的使用练习1
    //lambda需要两个或以上的参数时,多条执行语句,并有返回值时
    @Test
    public void test7(){
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {

            }
        };
        int compare1 = com1.compare(21,35);
        System.out.println(compare1);

        System.out.println("**********下面为使用lambda表达式*********");

        Comparator<Integer> com2 = (o1,o2) ->{
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        int compare2 = com2.compare(12,32);
        System.out.println(compare1);
    }



    //lambda表达式的使用练习2
    //两个参数,一个返回值
    @Test
    public void test7(){
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare1 = com1.compare(21,35);
        System.out.println(compare1);

        System.out.println("**********下面为使用lambda表达式*********");
        Comparator<Integer> com2 = (o1,o2) -> Integer.compare(o1,o2);
        int compare2 = com2.compare(12,32);
        System.out.println(compare1);
    }

    //lambda表达式的使用练习3
    //无参,无返回值
    @Test
    public void test10(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("去北京喝豆汁");
            }
        };
        r1.run();
        System.out.println("**********下面为使用lambda表达式*********");

        Runnable r2 = () -> System.out.println("去四川吃火锅");
        r2.run();
    }

    //lambda表达式的使用练习4
    //只有一个参数
    @Test
    public void test11(){
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("好像在哪里见过?");

        Consumer<String> con1 = s -> System.out.println(s);
        con1.accept("我想在梦里遇见你!");

    }

1.5.函数式接口:
问题一:什么是函数式接口?为什么需要函数式接口?

  • 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口。
  • 因为只有给函数式接口提供实现类的对象时,我们才可以使用lambda表达式:

问题二:api中函数式接口所在的包

  • jdk8中声明的函数式接口都在java.util.function包下

问题三:4个基本的函数式接口

接口名称称谓参数类型返回类型用途
Consumer<T>消费型接口T对类型为 T 的对象应用操作,包含方法: void accept(T t)
Supplier<T>供给型接口T返回类型为 T 的对象,包含方法: T get()
Function<T, R>函数型接口TR对类型为 T 的对象应用操作,并返回结果,包含方法: R apply(T t)
Predicate<T>判断型接口Tboolean确定类型为 T 的对象是否满足某约束,包含方法: boolean test(T t)

函数式接口的使用实例:

/*ConsumerConsumer<T> void accept(T t);*/
    //语法格式:lambda表达式使用时,只有一个参数,可以省略掉()
    @Test
    public void test11(){
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("好像在哪里见过?");

        Consumer<String> con1 = s -> System.out.println(s);
        con1.accept("我想在梦里遇见你!");

    }

    /*Supplier<T> T get();*/
    @Test
    public void test12(){
        //构造器引用
        Supplier<Person> sup1 = Person :: new;
        System.out.println(sup1.get());
    }


    /*Function<T, R> R apply(T t)*/
    @Test
    public void test13(){
        Function<Integer,Person> fun1 = Person::new;
        System.out.println(fun1.apply(14));
    }

    /*BiFunction<T, U, R>  R apply(T t, U u)*/
    @Test
    public void test14(){
        BiFunction<String, Integer, Person> bif = Person::new;
        System.out.println(bif.apply("Tom", 18));
    }

1.6 语法规则总结;

  • ->的左边:lambda形参列表,参数的类型都可以省略。如果形参只有一个,则一对()也可以省略
  • ->的右边:lambda体,对应着重写的方法的方法体。如果方法体中只有一行执行语句,则一对{可以省略,若有return关键字,则必须一并省略。

2. 方法引用

2.1 方法的格式:

  • Integer::compare

2.2 方法引用的埋解

  • 方法引用,可以看做是基于lambda表达式的进一步刻画
  • 当需要提供一个函数式接口的实例时,我们可以使用lambda表达式提供此实例。

>当满足一定的条件的情况下,我们还可以使用方法引用或构造器引用替换lambda表达式

2.3 方法引用的本质:

  • 方法引用作为了函数式接口的实例。--->“万事万物皆对象"

2.4 格式:

  • 类(或对象)::方法名

2.5.具体使用情况

情况1: 对象::实例方法
  • 要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类都相同
  • 此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

注意:此方法b是非静态的方法,需要对象调用

代码实例
/*情况一:对象::实例方法
    * Consumer中的void accept(T t)
    * PrintStream中的void println(T t)
    * */
    @Test
    public void test1(){
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };

        con.accept("喜羊羊与灰太狼");

        //lambda表达式
        Consumer<String> con1 = s->System.out.println(s);
        con1.accept("美羊羊与沸羊羊");

        //方法引用
        Consumer<String> con2 = System.out::println;
        con2.accept("懒洋洋的睡一觉");
    }

    /*Supplier中的get()方法
    * Employee中的String getName()
    * */
    @Test
    public void test2(){
        Employee emp = new Employee(1002,"马云",2, 9876.12);
        Supplier<String> sup1 = new Supplier<String>() {
            @Override
            public String get() {
                return emp.getName();
            }
        };

        System.out.println(sup1.get());

        //lambda方法
        Supplier<String> sup2 = ()-> emp.getName();
        System.out.println(sup2.get());

        //方法引用
        Supplier<String> sup3 = emp::getName;
        System.out.println(sup3.get());

    }
情况2: 类::静态方法

要求:

  • 函数式接口中的抽象方法a与其内部实现时调用的类的某个静态方法b的形参列表和返回值类型都相同(或一致),此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

注意:此方法b是静态的方法,需要类调用。

代码实例
//情况二:类::静态方法
    /*
    * Comparator中的int compare(T t,T t)
    * Integer中的int compare(T t,T t)
    * */
    @Test
    public void test3(){
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        System.out.println(com1.compare(12, 21));

        //lambda表达式
        Comparator<Integer> com2 = (o1 ,o2)->Integer.compare(o1,o2);
        System.out.println(com2.compare(21, 22));

        //方法引用
        Comparator<Integer> com3 = Integer::compare;
        System.out.println(com3.compare(44, 43));
    }

    /*
     * Function中的apply(T t)
     * Math中的long round(Double d)
     * */
    @Test
    public void test4(){
        Function<Double,Long> fun1 = new Function<Double, Long>() {
            @Override
            public Long apply(Double aDouble) {
                return Math.round(aDouble);//四舍五入
            }
        };
        System.out.println(fun1.apply(1.4));

        Function<Double,Long> fun2 = aDouble -> Math.round(aDouble);
        System.out.println(fun2.apply(1.6));

        Function<Double,Long> fun3 = Math::round;
        System.out.println(fun3.apply(2.1));
    }
情况3: 类::实例方法

要求:

  • 函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的返回值类型相同。同时,抽象方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第1个参数作为方法b的调用者,且抽象方法a的后n-1个参数与方法b的n-1个参数的类型相同(或一致)。则可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用

注意:此方法b是非静态的方法,需要对象调用。但是形式上,写出对象a所属的类

代码实例
    //情况三:类::实例方法(难)
    /*
    * Comparator的int compare(T t,T t)
    * String中的int t1.compare(t2)
    *  */
    @Test
    public void test5(){
        Comparator<String> com1 = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };



        //方法引用
        Comparator<String> com2 = String::compareTo;
        System.out.println(com2.compare("abb","abb"));
    }

    /*
    * BiPredicate中的boolean test(T t1,T t2)
    * String中的boolean t1.equals(t2)
    * */
    @Test
    public void test6(){
        BiPredicate<String,String> bip = new BiPredicate<String, String>() {
            @Override
            public boolean test(String s1, String s2) {
                return s1.equals(s2);
            }
        };
        System.out.println(bip.test("10001", "10001"));

        //lambda表达式
        BiPredicate<String,String> bip1 = (s1,s2)->s1.equals(s2);
        System.out.println(bip.test("103", "1031"));

        //方法引用
        BiPredicate<String,String> bip2 = String::equals;
        System.out.println(bip.test("101", "10"));
    }

    /*
    * Function中的R apply(T t)
    * Employee中的string getName();
    * */
    @Test
    public void test7(){
        Employee emp = new Employee(1003,"刘强东",33,3000.82);

        Function<Employee,String> fun1 = new Function<Employee, String>() {
            @Override
            public String apply(Employee employee) {
                return emp.getName();
            }
        };
        System.out.println(fun1.apply(emp));

        //方法引用
        Function<Employee,String> fun2 = Employee::getName;
        System.out.println(fun2.apply(emp));
    }
}

3. 构造器引用

3.1 格式

  • 类名:: new

3.2 说明

  • 调用了类名对应的类中的某一个确定的构造器
  • 具体调用的是类中的哪一个构造器呢?取决于函数式接口的抽象方法的形参列表!

3.3 代码示例

    /*Supplier<T> T get();*/
    @Test
    public void test12(){
        //构造器引用
        Supplier<Person> sup1 = Person :: new;
        System.out.println(sup1.get());
    }


    /*Function<T, R> R apply(T t)*/
    @Test
    public void test13(){
        Function<Integer,Person> fun1 = Person::new;
        System.out.println(fun1.apply(14));
    }

    /*BiFunction<T, U, R>  R apply(T t, U u)*/
    @Test
    public void test14(){
        BiFunction<String, Integer, Person> bif = Person::new;
        System.out.println(bif.apply("Tom", 18));
        //调用的是参数Integer和String类型,所以出来的是名字和年龄
    }

4. 数组引用

格式: 数组名[]::new

代码示例

//  数组引用
    @Test
    public void test15(){
        Function<Integer, Person[]> fun2 = new Function<Integer, Person[]>() {
            @Override
            public Person[] apply(Integer length) {
                return new Person[length];
            }
        };
        System.out.println(fun2.apply(13).length);

        Function<Integer,Person[]> fun1 = Person[] :: new;
        System.out.println(fun1.apply(14).length);//数组的长度等于14
    }

二、StreamAPI

前言:

问题 :什么是Stream?
Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
Stream 和 Collection 集合的区别: Collection 是一种静态的内存数据结构,讲的是数据,而 stream 是有关计算,讲的是计算。前者是主要面向内存,存储在内存中,后者主要是面向CPU,通过 CPU 实现计算。

1.Stream API vs 集合框架

  • Stream API 关注的是多个数据的计算(排序、查找、过滤、映射、遍历等),面向CPU的。
  • 集合关注的数据的存储,面向内存的。

即 :Stream API 之于集合,类似于SOL之于数据表的查询。

2.使用说明

  • Stream 自己不会存储元素。
  • Stream不会改变源对象。相反,他们会返回一个持有结果的新stream。
  • Stream, 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果。
  • Stream一旦执行了终止操作,就不能再调用其它中间操作或终止操作了。

3.Stream 执行流程

Stream的操作三个步骤
1.创建 stream

  • 一个数据源(如:集合、数组),获取一个流

2.中间操作

  • 每次处理都会返回一个持有结果的新stream,即中间操作的方法返回值仍然是stream类型的对象。因此中间操作可以是个 操作链 ,可对数据源的数据进行n次处理,但是在终结操作前,并不会真正执行。

3.终止操作

  • 终止操作的方法返回值类型就不再是stream了,因此一旦执行终止操作,就结束整个stream操作了。一旦执行终止操作,就执行中间操作链,最终产生结果并结束stream。

图示:

3.1 Stream的实例化

1.三种实例化的方式
  • 方式一:通过集合创建Stream实例
  • 方式二:通过数组创建Stream实例
  • 方式三:通过Stream.of()方式创建Stream实例
2.实例化代码实现
package data;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamAPiTest {
    //创建Stream方式一:通过集合
    @Test
    public void test1(){
        List<Employee> list = EmployeeData.getEmployees();
        //返回一个顺序流
        Stream<Employee> stream = list.stream();

        //返回一个并行流
        Stream<Employee> stream1 = list.parallelStream();

        System.out.println(stream);
        System.out.println(stream1);
    }

    //创建Stream方式二:使用数组
    @Test
    public void test2(){
        //调用Arrays类的static <T>  Stream <T> Stream(T[] array): 返回一个流
        Integer[] arr = new Integer[] {1,2,3,4,5};
        Stream<Integer> stream = Arrays.stream(arr);

        int[] arr1 = new int[]{1,2,3,4,5};
        IntStream stream1 = Arrays.stream(arr1);
    }


    //创建Stream方式三:通过Stream的of()
    @Test
    public void test3(){
        Stream<String> stream = Stream.of("AA","BB","CC","DD","EE");
    }
}

3.2 中间操作

1.筛选与切片
方法描述
filter(Predicate p)接收一个 Lambda ,过滤掉不符合条件的元素。
distinct()筛选,通过流所生成元素的 hashCode() 和 equals() 方法去除重复元素。
limit(long maxSize)截断流,使其元素数量不超过指定数量。
skip(long n)跳过前 n 个元素,返回一个新的流。若流中元素不足 n 个,则返回一个空流,与 limit(n) 互补。

2.映射
方法描述
map(Function f)接收一个函数作为参数,该函数应用于每个元素,并映射成一个新的元素。
mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数应用于每个元素,产生一个新的 DoubleStream
mapToInt(ToIntFunction f)接收一个函数作为参数,该函数应用于每个元素,产生一个新的 IntStream
mapToLong(ToLongFunction f)接收一个函数作为参数,该函数应用于每个元素,产生一个新的 LongStream
flatMap(Function f)接收一个函数作为参数,将流中的每个值换成另一个流,然后将所有流连接成一个流。
3.排序 
方法描述
sorted()产生一个新流,其中按自然顺序排序。
sorted(Comparator com)产生一个新流,其中按提供的比较器顺序排序。
4.中间操作代码实现
//中间操作
    //筛选与切片
    @Test
    public void test4(){
        //filter(Predicate p),接收lambda方法---移除某些元素
        //集合实例化
        List<Employee> list = EmployeeData.getEmployees();

        //通过集合创建Stream的实例
        Stream<Employee> stream = list.stream();

        //查询员工表中薪资大于7000的员工的信息
        stream.filter(emp -> emp.getSalary() > 7000).forEach(System.out::println);

        System.out.println("************************");
        //由于在上面Stream已经实行了终止操作,所以不可以在调用其他方法的终止操作
        //limit--截断流,使其元素不超过指定数量
        list.stream().filter(emp->emp.getSalary() > 7000).limit(2).forEach(System.out::println);

        //skip--跳过流,跳过前n个元素
        list.stream().skip(4).forEach(System.out::println);

    }
    
    
    //映射
    @Test
    public void test5(){
        //map(Function f)接收一个函数作为参数,该函数应用于每个元素,并映射成一个新的元素。
        //转换为大写   toUpperCase() 将字符串转换为大写
        List<String> list = Arrays.asList("aa","bb","cc","dd");
        list.stream().map(String::toUpperCase).forEach(System.out::println);

        //获取姓名长度大于3的员工的姓名
        List<Employee> employees = EmployeeData.getEmployees();
        //先过滤后映射
        employees.stream().filter(emp->emp.getName().length() > 3).map(Employee::getName).forEach(System.out::println);
        //先映射后过滤
        employees.stream().map(Employee::getName).filter(name->name.length()>3).forEach(System.out::println);
    }
    
    
    //排序
    @Test
    public void test6(){
        //sorted()--自然排序
        Integer[] arr = new Integer[]{12,34,65,23,1,23,4,45};
        String[] arr1 = new String[]{"SS","EE","CC","BB","AA"};

        //使用数组创建Stream实例
        Arrays.stream(arr).sorted().forEach(System.out::println);

        //原本的数组并没有升序,而调整
        //Stream不会改变原对象
        System.out.println(Arrays.toString(arr));

        //sorted(comparator c)--定制排序
        Arrays.stream(arr1).sorted(String::compareTo).forEach(System.out::println);
    }

3.3 终止操作

1.匹配与查找
方法描述
allMatch(Predicate p)检查是否匹配所有元素
anyMatch(Predicate p)检查是否至少匹配一个元素
noneMatch(Predicate p)检查是否没有匹配任何元素
findFirst()返回第一个元素
findAny()返回当前流中的任意元素
count()返回流中元素的总数
max(Comparator c)返回流中元素的最大值
min(Comparator c)返回流中元素的最小值
forEach(Consumer c)对流中的每个元素执行给定的操作(内部迭代)
2.归约
方法描述
reduce(T identity, BinaryOperator b)可将流中元素反复结合起来,得到一个值。返回T
reduce(BinaryOperator b)可将流中元素反复结合起来,得到一个值。返回 Optional<T>
3.收集
方法描述
collect(Collector c)将流转换为其他形式。接收一个 Collector 接口的实现,用于给Stream中的元素汇总的方法
4.终止操作代码实现

//终止操作
    //匹配与查找
    @Test
    public void test7(){
        //allMatch检查是否匹配所有元素
        //是否所有员工都大于20岁
        List<Employee> list = EmployeeData.getEmployees();
        System.out.println(list.stream().allMatch(emp -> emp.getAge() > 20));

        //anyMatch检查是否至少一个元素满足要求
        System.out.println(list.stream().anyMatch(emp -> emp.getSalary() > 9600));

        //findFirst返回第一个元素
        System.out.println(list.stream().findFirst().get());

        //findAny返回任意一个元素
        System.out.println(list.stream().findAny().get());

        //count 返回流中元素的总数
        System.out.println(list.stream().filter(emp -> emp.getSalary() > 7000).count());

        //max(Comparator c) 返回流中最大值
        System.out.println(list.stream().max((a1, a2) -> Integer.compare(a1.getAge() , a2.getAge())));

        //min(Comparator c) 返回流中最大值
        System.out.println(list.stream().min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())));

        //forEach(Consumer c),遍历
        list.stream().forEach(System.out::println);
    }


    //归约
    @Test
    public void test8(){
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        //reduce(T identity, BinaryOperator b)
        //可将流中元素反复结合起来,得到一个值。返回T
        //操作;计算1-10的和
        System.out.println(list.stream().reduce(0, (s1, s2) -> s1 + s2));
        //前面的0或者10,相当于起始值
        System.out.println(list.stream().reduce(5, (s1, s2) -> s1 + s2));

        System.out.println(list.stream().reduce(15, Integer::sum));



        //reduce(BinaryOperator b)
        //可将流中元素反复结合起来,得到一个值。返回Optional<T>
        //操作:计算公司所有员工工资的总额

        List<Employee> list1 = EmployeeData.getEmployees();
        //先映射后计算
        list1.stream().map(emp->emp.getSalary()).reduce((s1,s2)->Double.sum(s1,s2));
        list1.stream().map(emp->emp.getSalary()).reduce(Double::sum);

    }

    //收集
    @Test
    public void test9(){
        /*collect(Collector c)
        将流转换为其他形式。接收一个Collector接口的实现
        用于给Stream中的元素汇总的方法*/
        //题目1:查找工资大于6000的员工,结果返回set或list
        List<Employee> list = EmployeeData.getEmployees();
        List<Employee> list1 = list.stream().filter(emp -> emp.getSalary() > 6000).collect(Collectors.toList());
        Set<Employee> list2 = list.stream().filter(emp -> emp.getSalary() > 6000).collect(Collectors.toSet());

        list.forEach(System.out::println);
        System.out.println();

        list1.forEach(System.out::println);
        System.out.println();

        list2.forEach(System.out::println);
        System.out.println();

        //题目2:按照员工的年龄排序,返回一个list
        //升
        List<Employee> list3 = list.stream().sorted((e1,e2)->e1.getAge()-e2.getAge()).collect(Collectors.toList());
        list3.forEach(System.out::println);

        System.out.println();

        //降
        List<Employee> list4 = list.stream().sorted((e1,e2)-> -(e1.getAge()-e2.getAge())).collect(Collectors.toList());
        list4.forEach(System.out::println);

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

django游戏门户系统

想做毕业设计但还没有头绪&#xff1f;&#x1f64b;‍♂️django游戏门户系统了解一下&#xff01;这个系统不仅功能全面&#xff0c;还能轻松解决你的项目选题难题&#xff01; 我们这个基于Django开发的游戏门户系统提供了用户注册、登录、内容发布以及管理功能&#xff0c…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

LeetCode反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#…

011:软件卸载工具TotalUninstall安装教程

摘要&#xff1a;本文详细介绍软件卸载工具TotalUninstall安装流程。 一、软件介绍 TotalUninstall是一款功能强大的卸载与清理工具&#xff0c;它能够彻底卸载不需要的应用程序&#xff0c;并清除相关的注册表项、文件残留和临时文件&#xff0c;确保系统干净无残留&#xff…

美畅物联丨视频上云网关如何配置上级联网云平台

在当今的智慧交通与安防监控体系中&#xff0c;视频上云网关发挥着至关重要的作用。以美畅视频上云网关为例&#xff0c;具备强大的兼容性&#xff0c;能够对接来自不同厂家、不同型号的视频设备&#xff0c;将这些设备输出的各异视频流进行汇聚整合。在获取摄像机视频流后&…

深入理解JavaScript:两大编程思想和ES6类以及对象概念解析

文章目录 两大编程思想ES6中的类和对象 两大编程思想 面向过程 &#xff08;Procedural-Oriented Programming&#xff0c;POP&#xff09; 定义&#xff1a;面向过程的编程是一种基于过程调用的编程范式&#xff0c;它将程序看作是一系列函数或过程的集合。每个函数负责完成…

推荐一个好用的VSCode插件

还在花馒头使用 Copilot&#xff1f;别再做大冤种啦&#xff01; 现在有个更好用的AI编程助手--豆包 MarsCode&#xff01;它不仅完全免费&#xff0c;而且功能强大&#xff0c;让你在编程时得心应手&#xff01;再也不用担心高昂的订阅费用&#xff0c;省下来的馒头&#xff…

衡石分析平台系统分析人员手册-图表查询应用

查询应用​ 在业务分析过程中&#xff0c;查询明细数据有时需要满足如下场景&#xff1a; 在自助化的操作界面中用户可以自主选择查询字段及相应的筛选条件进行查询。用户通过简单的鼠标点击能够快速获得所需数据&#xff0c;并提供聚合计算等高级功能。 上述场景可以通过查…

数据结构与算法-21算法专项(中文分词)(END)

中文分词 搜索引擎是如何理解我们的搜索语句的&#xff1f; mysql中使用 【like “%中国%”】&#xff0c;这样的使用方案 缺点1&#xff1a;mysql索引会失效缺点2&#xff1a;不能模糊&#xff0c;比如我搜湖南省 就搜不到湖南相关的 1 trie树 Trie树&#xff0c;又称前缀树…

C++ 中的可调用对象

目录 一.可调用对象简介 1.什么是可调用对象&#xff1f; 2.可调用对象有什么用&#xff1f; 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …

完全了解一个asp.net core MVC项目模板

当我们使用Visual Studio 2022去新建一个基于asp.net core Web项目的时候&#xff0c;一般有三种选择&#xff0c;一种是空项目&#xff0c;一种是基于MVC的项目、再有一种就是基于包含Razor Pages实例的web应用。如下图&#xff1a; 今天&#xff0c;我们打算选择基于MVC模…

《MYSQL 实战45讲》 慢查询产生的原因

一.查询长时间不返回的原因 首先要执行下show processlist来查看各个线程的状态&#xff08;是否在等待锁&#xff09; 1.DML写锁导致其他线程对改表的读取被阻塞 当一个线程正在持有t表的DML写锁时&#xff0c;其他线程查询语句就会被阻塞&#xff0c;一直等到DML写锁释放才…

RWA“两链一桥”平台在香港金融科技周亮相

第九届香港金融科技周今日开幕&#xff0c;记者在主题为Trust Bridge的论坛上获悉&#xff0c;蚂蚁数科旗下蚂蚁链在此次金融科技周首次公开了其为RWA业务打造的“两链一桥”平台&#xff0c;旨在帮助更多内地新能源资产赴港RWA&#xff0c;实现技术赋能实体资产。 “两链一桥“…

MySQL8 安装配置及卸载教程

MySQL8 安装配置及卸载教程 0 卸载 MySQL 如果之前没安过 MySQL &#xff0c;或者卸载干净了不用看这个。 如果安装中出现以下问题&#xff0c;有可能是为之前安装 MySQL 不成功&#xff0c;有残留的安装程序等文件程序或者是卸载 MySQL 不成功。 0.1 停止服务 首先进入服务…

LabVIEW航空发动机测试系统

随着航空工业的快速发展&#xff0c;发动机性能的测试与优化成为确保航空安全的关键任务。针对日益复杂的性能需求&#xff0c;开发了一套基于LabVIEW的航空发动机测试系统&#xff0c;能够进行精确的性能评估与实时数据分析。系统将软件与硬件深度结合&#xff0c;实现了自动化…

容联云容犀Copilot&Agent荣获「2024中国大模型应用之星」

近日&#xff0c;2024中国智能应用发展大会于北京举行&#xff0c;容联云凭借大模型应用——容犀Copilot&#xff06;Agent在大模型应用领域的卓越表现和标杆案例&#xff0c;荣获“2024中国大模型应用之星奖”。 中国软件网CEO、海比研究院院长曹开彬在开场致辞中明确指出&…

建筑行业知识管理:构建高效文档管理系统,提升项目协作与管控能力

各行各业都在经历数字化转型&#xff0c;建筑行业也不例外&#xff0c;正经历着前所未有的变革。随着工程项目规模的扩大和复杂性的增加&#xff0c;传统的管理方式已难以满足高效协作和精准管控的需求。因此&#xff0c;构建一个高效的在线AI知识库管理系统&#xff0c;成为提…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前&#xff0c;作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解&#xff0c;晕头转向。 SD卡&#xff1a;Secure Digital Card的英文缩写&#xff0c;直译就是“安全数字卡”。一般用于大一些的电子设备比如&#xff1a;电脑、数码相机、AV…

【视频】Camera结构详解

1、爆炸图 先看几张爆炸图: lens:镜头 VCM:音圈马达 Voice coil motor Mount :固定座 IR Filter:滤光片 Sensor:感光传感器(图像传感器) Substrate:基板 FPC:柔性印制电路板 2、镜头 镜头是仅次于Sensor芯片影响画质的第二要素,其组成是透镜结构,由几片透镜组…