Java响应式编程

2023-11-19

一、lambda表达式

1.1 lambda简介

Lambda是Java 8中添加的新特性,Lambda表达式本质上是匿名方法,其底层还是通过invokedynamic指令来生成匿名类来实现。它提供了更为简单的语法和写作方式,允许你通过表达式来代替函数式接口。

1.2 lambda语法

语法:

​ (parameters) -> expression 或 (parameters) ->{ statements; }

特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

注意:需要注意 lambda 表达式隐含了 return 关键字,所以在单个的表达式中,我们无需显式的写 return 关键字,但是当表达式是一个语句集合的时候则需要显式添加 return 关键字,并用花括号{ } 将多个表达式包围起来。

示例:

public class Lambda {
    public static void main(String[] args) {

        //1.不需要参数
        Example1 example1 = () -> 5;

        //2.接收一个参数。有一个返回值   一个参数的时候 () 可以省略
        Example2 example2 = a -> 2 * a;
        Example2 example21 = (a) -> 2 * a;

        //3.接收2个参数。返回差值
        Example3 example3 = (a, b) -> a - b;

        //4.接收2个参数,打印值,没有返回值
        Example4 example4 = (a, b) -> System.out.println("我是字符串" + a + "与数值:" + b);
        //当表达式是一个语句集合的时候则需要显式添加 return 关键字,并用花括号{ } 将多个表达式包起来
        Example4 example41 = (a, b) -> {
            if (b > 10) {
                System.out.println(a);
            }
        };
    }

    interface Example1 {
        int test();
    }

    interface Example2 {
        int test(int a);
    }

    interface Example3 {
        int test(int a, int b);
    }

    interface Example4 {
        void test(String b, int a);
    }
}

通过上面的接口我们可以发现:我们定义的接口都只有一个抽象方法,也称为:函数式接口

lambda 表达式的使用需要借助于函数式接口,也就是说只有函数式接口出现地方,我们才可以将其用 lambda 表达式进行简化。

函数接口的定义:仅含有一个抽象方法的接口。

注意:如果接口存在多个方法,我们可以使用default关键字修饰方法,定义方法的方法体,保证接口只存在一个抽象方法,那么这个接口也符合函数式接口的定义。

1.3 @FunctionalInterface

用于标记该接口是一个函数式接口,不过该注解是可选的,当添加了该注解之后,编译器会限制了该接口只允许有一个抽象方法,否则报错,所以推荐为函数式接口添加该注解。

jdk1.8自带的函数接口:

接口 输入参数 返回类型 说明
Predicate T boolean 断言
Consumer T / 消费一个数据
Function<T, R> T R 输入T,输出R的函数
Supplier / T 提供一个数据
UnaryOperator T T 一元函数(输出输入类型相同)
BiFunction<T, U, R> (T, U) R 2个输入的函数
BinaryOperator (T, T) T 二元函数(输出输入类型相同)

事例

public static void main(String[] args) {
  //断言函数
  Predicate<Integer> predicate = i -> i > 0;
  System.out.println(predicate.test(-10));

  //消费函数接口
  Consumer<String> consumer = System.out::println;
  consumer.accept("测试消费函数接口");

  //输入输出函数接口
  Function<String, Integer> function = String::length;
  System.out.println(function.apply("apply"));

  //提供数据函数接口
  Supplier<String> supplier = () -> "hello world";
  System.out.println(supplier.get());

  //一元函数接口
  UnaryOperator<String> unaryOperator = t -> "Hello," + t;
  System.out.println(unaryOperator.apply("张三"));

  //两个输入函数接口
  BiFunction<String, Integer, Map<String, Integer>> biFunction = (k, v) -> {
    Map<String, Integer> map = new HashMap<>();
    map.put(k, v);
    return map;
  };
  System.out.println(biFunction.apply("name", 9999).get("name"));

  //二元函数接口
  BinaryOperator<String> binaryOperator = (t1, t2) -> t1 + ":" + t2;
  System.out.println(binaryOperator.apply("张三", "晚上吃什么?"));
}

1.4 方法引用

  • 静态方法引用
  • 非静态方法引用
  • 构造器引用
public class LambdaDemo {

    public static void main(String[] args) {
        //参数声明
        say((n, m) -> n + m);
        //单行表达式
        say((String n, String m) -> n + m);
        //语句块
        say((String n, String m) -> {
            return n + m;
        });
        //1.静态方法引用,引起方法【sayOne】的参数与函数式接口【LambdaInteracce】的参数类型一致,且【sayOne】为静态方法
        say(LambdaDemo::sayOne);

        //2.非静态方法引用
        //实例对象引用
        say(new LambdaDemo()::sayTwo);
        //参数对象引用,这个相当于say((n, m) -> n.concat(m));
        say(String::concat);

        //3.构造函数引用
        //无参构造
        Supplier<LambdaDemo> lb1 = LambdaDemo::new;
        System.out.println(lb1.get());
        //有参构造
        Function<String, LambdaDemo> lb2 = LambdaDemo::new;
        System.out.println(lb2.apply("张三"));
    }

    private String name;

    public LambdaDemo() {

    }

    public LambdaDemo(String name) {
        this.name = name;
    }

    /**
     * 什么函数表达式
     */
    @FunctionalInterface
    interface LambdaInteracce {
        String sayHello(String name, String message);
    }

    private static void say(LambdaInteracce lambda) {
        String result = lambda.sayHello("张三", "Hello World");
        System.out.println(result);
    }

    private static String sayOne(String name, String message) {
        return name + message;
    }

    private String sayTwo(String name, String message) {
        return name + message;
    }

    @Override
    public String toString() {
        return "创建新对象:LambdaDemo{} name: " + this.name;
    }
}

1.5 类型推断

public class Test03 {

    public static void main(String[] args) {
        //变量类型定义
        IMath math1 = (x, y) -> x + y;

        //数组定义
        IMath[] maths = {(x, y) -> x + y};

        //强制转换
        Object math2 = (IMath) (x, y) -> x + y;

        //通过返回类型
        IMath math3 = getMath();
    }

    private static IMath getMath(){
        return (x, y) -> x + y;
    }

    interface IMath {
        int add(int x, int y);
    }
}

1.6 变量引用

jdk1.8之前,内部类如果需要访问外部变量,那这个变量必须声明为final类型,在jdk1.8中也是一致的,只不过jdk1.8中可以不加final这个关键字,但是实际上这个变量也是不能修改的。

为什么内部类访问外部变量必须是final修饰的? – 因为Java中传参的形式是传值,而不是传引用。

1.7 级联表达式和柯里化

级联表达式:有多个->的表达式。

Function<Integer, Function<Integer, Integer>> f = x -> y -> x + y;
System.out.println(f.apply(100).apply(200));

柯里化:把多个参数的函数转换为只有一个参数的函数。

柯里化目的:函数标准化。

Function<Integer, Function<Integer, Function<Integer, Integer>>> fun = x -> y -> z -> x + y +z;
System.out.println(fun.apply(1).apply(2).apply(3));

二、Stream流编程

2.1 概念

​ 首先要了解的是java8中的stream与InputStream和OutputStream是完全不同的概念,,stream是用于对集合迭代器的
增强,使之完成能够完成更高效的聚合操作(过滤排序、统计分组)或者大批量数据操作。此外与stream与lambada表达示结合后编码效率与大大提高,并且可读性更强。

示例:

//获取所有红色苹果的总重量
appleStore.stream()
  .filter(a -> "red".equals(a.getColor()))
  .mapToInt(w -> w.getWeight()).sum();
//基于颜色计算平均重量
Map<String, Double> collect = appleList.stream()
  .collect(Collectors.groupingBy(a -> a.getColor(), Collectors.averagingDouble(a -> a.getWeight())));

2.2 外部迭代和内部迭代

public static void main(String[] args) {
  int[] nums = {1, 2, 3};
  //外部迭代
  int sum = 0;
  for (int i = 0; i < nums.length; i++) {
    sum += nums[i];
  }
  System.out.println(sum);

  //内部迭代
  int sum1 = IntStream.of(nums).sum();
  System.out.println(sum1);
}

2.3 流的创建

相关方法
集合 Collection.stream/parallelStream
数组 Arrays.stream
数字 IntStream/LongStream.range/rangeClosed
Random.ints/longs/doubles
自己创建 Stream.generate/iterate

示例

基于Connection:

//示例
new ArrayList<>().stream().forEach(System.out::println);

基于Arrays:

//示例
Arrays.stream(new String[]{"a", "b", "c"}).forEach(System.out::println);

基于Stream API生成:

//示例
Stream.of("a", "b", "c").forEach(System.out::println)
Stream.of(new String[]{"a","b","c"}).forEach(System.out::println);
Stream.iterate(0, a -> a+1).limit(10).forEach(System.out::println);
Random random = new Random();
Stream.generate(() -> random.nextInt()).limit(10).forEach(System.out::println);
//int数字流
IntStream.of(1, 2, 3, 4).forEach(System.out::println);
//long数字流
LongStream.of(1, 2, 3, 4).forEach(System.out::println);
//以增量步长1从startInclusive(包括)到endExclusive(不包括)返回顺序的有序LongStream。
LongStream.range(100, 200).limit(10).forEach(s -> System.out.println(s));
//创建10个1000-2000的数字
IntStream.rangeClosed(1000, 2000).limit(10).forEach(System.out::println);
//随机数流,随机生成100-200的10个数字
new Random().ints(100, 200).limit(10).forEach(System.out::println);

IntStream.range()和IntStream.rangeClosed区别:其实区别就是开区间和闭区间的区别,如:[1,20)和[1,20]的区别

IntStream.range(1,20).forEach(i-> System.out.print(i));//返回一个1-19的数字流
IntStream.rangeClosed(1,20).forEach(i-> System.out.print(i));//返回的一个1-20的数字流

2.3 中间操作/终值操作和惰性求值

2.3.1 中间操作

中间操作:返回stream的操作。

有状态和无状态的区分:函数接口是1个参数的就是无状态操作;有2个参数的就是有状态操作。

操作类型 相关方法
无状态操作 map/mapToXxx
flatMap/flatMapToXxx
filter
peek
unordered
有状态操作 distinct
sorted
limit/skip
  • map/mapToXxx:将A对象转换成B对象。
  • flatMap/flatMapToXxx:A->B属性(集合),最终得到所有的A元素里面的所有B属性集合。
  • peek用于debug,是个中间操作,与forEach的区别:forEach是终值操作。
  • unordered:一般在并行流中才会使用,平时用的也不多。
  • limit:主要用于无限流,用来做限制操作,防止无限循环。
  • skip:用于跳过一些数据。

示例:

filter、map:

@Test
public void test2(){
  String str = "my name is zhangsan";
  Arrays.stream(str.split(" ")) //使用Arrays创建流
    .filter(s -> s.length() > 2) //过滤长度小于2的数据
    .map(s -> s.length()) //将String数据转成int
    .forEach(System.out::println);//遍历打印数据
}

flatMap:

@Test
public void test3(){
  String str = "my name is zhangsan";
  Arrays.stream(str.split(" "))
    .flatMap(s -> s.chars().boxed())
    .forEach(i -> System.out.println((char)i.intValue()));
}

peek:

@Test
public void test4(){
  String str = "my name is zhangsan";
  Arrays.stream(str.split(" "))
    .peek(System.out::println)
    .forEach(System.out::println);
}

注意:intStream/longStream并不是Stream的子类,所以需要进行装箱,调用boxed()。

惰性求值:只刻画了stream,但是并没有产生新的集合,而像这种没有实际功能,只是描述stream的操作,就叫做惰性求值。

2.3.2 终值操作

操作类型 相关方法
非短路操作 forEach/forEachOrdered
collect/toArray
reduce
min/max/count
短路操作 findFirst/findAny
allMatch/anyMatch/noneMatch
  • forEachOrdered:主要用于并行流,用来保证顺序。
  • collect/toArray:主要用于数据收集操作,可以转成数组或List。
  • reduce:累加器。

示例:

forEach/forEachOrdered:

@Test
public void test5(){
  String str = "my name is zhangsan";
  //使用并行流
  Arrays.stream(str.split(" ")).parallel().forEach(System.out::print);
  //并行流,使用forEachOrdered保证顺序
  Arrays.stream(str.split(" ")).parallel().forEachOrdered(System.out::print);
}

collect/toArray:

@Test
public void test6(){
  String str = "my name is zhangsan";
  //收集到List
  List<String> list = Arrays.stream(str.split(" ")).collect(Collectors.toList());
  System.out.println(list);//[my, name, is, zhangsan]
  Object[] array = Arrays.stream(str.split(" ")).toArray();
  System.out.println(Arrays.toString(array));//[my, name, is, zhangsan]
}

reduce:

@Test
public void test7() {
  String str = "my name is zhangsan";
  //使用reduce拼接字符串
  Optional<String> reduce = Arrays.stream(str.split(" ")).reduce((t1, t2) -> t1 + "|" + t2);
  String result = reduce.orElse("");
  System.out.println(result);//my|name|is|zhangsan

  //带初始值的reduce
  String reduce1 = Arrays.stream(str.split(" ")).reduce("", (t1, t2) -> t1 + "-" + t2);
  System.out.println(reduce1);

  //计算单词总长度
  Integer reduce2 = Arrays.stream(str.split(" ")).map(s -> s.length()).reduce(0, (t1, t2) -> t1 + t2);
  System.out.println(reduce2);
}

min/max/count:

@Test
public void test8(){
  String str = "my name is zhangsan";
  //获取长度最大的单词
  Optional<String> max = Stream.of(str.split(" ")).max((s1, s2) -> s1.length() - s2.length());
  System.out.println(max.get());

  //获取长度最小的单词
  Optional<String> min = Stream.of(str.split(" ")).min((s1, s2) -> s1.length() - s2.length());
  System.out.println(min.get());

  //获取单词总数
  long count = Stream.of(str.split(" ")).count();
  System.out.println(count);
}

2.4 并行流

// 并行流创建
new ArrayList<>().parallelStream().forEach(System.out::println);
LongStream.rangeClosed(100,200)..parallel().forEach(System.out::println);
@Test
public void test11(){
  //注意:多次调用parallel/sequential,以最后一次为主。
  LongStream.rangeClosed(100,200)
  	.parallel().peek(s-> System.out.println(s)) //并行流
  	.sequential().peek(s -> System.out.println(s)) //串行流
  	.count();
}

注意:多次调用parallel/sequential,以最后一次为主。

使用默认线程池:

@Test
public void test11(){
  //并行流使用的线程池:ForkJoinPool.commonPool
  //默认的线程数是当前机器cpu的个数
  //修改默认线程数:
  System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "10");
  LongStream.rangeClosed(100,200)
  	.parallel()
  	.forEach(s -> System.out.println(Thread.currentThread().getName()));
}

自定义线程池:

@Test
public void test11(){
  //使用自己的线程池,不使用默认线程池,防止任务阻塞。
  //线程名字:ForkJoinPool-1
  ForkJoinPool pool = new ForkJoinPool(10);
  pool.submit(() -> {
    LongStream.rangeClosed(100,200)
      .parallel()
      .forEach(s -> System.out.println(Thread.currentThread().getName()));
  });
  pool.shutdown();

  synchronized (pool) {
    try {
      pool.wait();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

2.5 收集器

public class Test02 {

    private static List<Student> studentList = new ArrayList<>();

    static {
        studentList.add(new Student("张三", 18, Gender.MALE, "1班"));
        studentList.add(new Student("李四", 20, Gender.MALE, "2班"));
        studentList.add(new Student("小红", 15, Gender.FEMALE, "3班"));
        studentList.add(new Student("小美", 15, Gender.FEMALE, "1班"));
        studentList.add(new Student("赵六", 22, Gender.MALE, "2班"));
        studentList.add(new Student("小颖", 20, Gender.FEMALE, "3班"));
        studentList.add(new Student("小雪", 21, Gender.FEMALE, "1班"));
        studentList.add(new Student("小彤", 23, Gender.FEMALE, "1班"));
        studentList.add(new Student("王五", 30, Gender.MALE, "3班"));
    }

    @Test
    public void test1(){
       //得到所有学生的年龄列表
       //尽量使用方法引用代替lambda表达式:s -> s.getAge() ==> Student::getAge,不会多生成一个类似lambda$0这样的函数
        List<Integer> ageList = studentList.stream().map(Student::getAge).collect(Collectors.toList());
        System.out.println(Arrays.toString(ageList.toArray()));//[18, 20, 15, 15, 22, 20, 21, 23, 30]

        //统计汇总信息
        IntSummaryStatistics collect = studentList.stream()
                .collect(Collectors.summarizingInt(Student::getAge));
        System.out.println("年龄汇总信息" + collect);//IntSummaryStatistics{count=9, sum=184, min=15, average=20.444444, max=30}

        //分块
        Map<Boolean, List<Student>> genderMap = studentList.stream()
                .collect(Collectors.partitioningBy(s -> s.getGender().equals(Gender.MALE)));
        System.out.println("性别分类:" + genderMap);

        //分组
        Map<String, List<Student>> clazzMap = studentList.stream()
                .collect(Collectors.groupingBy(Student::getClazz));
        System.out.println("班级分组:" + clazzMap);

        //得到每个班级学生个数
        Map<String, Long> stuCountMap = studentList.stream()
                .collect(Collectors.groupingBy(Student::getClazz, Collectors.counting()));
        System.out.println("班级学生个数列表" + stuCountMap);
    }
}

2.6 Stream的运行机制

  1. 所有操作都是链式调用,一个元素只迭代一次。
  2. 每一个中间操作都会返回一个新的流,流里面有一个属性sourceStage指向同一个地方,就是Head。
  3. Head -> nextStage -> nextStage -> … ->null
  4. 有状态操作会把无状态操作截断,单独处理。
  5. 并行环境下,有状态的中间操作不一定能并行操作。
  6. parallel/sequential也是中间操作(也是返回stream),但是他们不创建流,他们只修改Head的并行标志。

三、Spring WebFlux开发

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java响应式编程 的相关文章

  • java.lang.NoClassDefFoundError: javax/ws/rs/core/Configuration

    我正在实现轻松的网络服务 并且正在使用 jboss 4 0 但我遇到以下异常 java lang NoClassDefFoundError javax ws rs core Configuration 我的 web xml 是
  • 如何使用postman调用REST API进行azure文件存储?

    我想通过postman调用azure的文件存储相关的REST API 以下是我提出请求的方式 我正在请求列出文件存储帐户中的所有共享 如下所述 https learn microsoft com en us rest api storage
  • 在 Windows 7 中,不从命令行强制终止 JVM

    我在 JVM 中运行了 Cobertura 仪器化 jar 当我在运行应用程序的 Windows 控制台中按 Ctrl C 时 JVM 结束并Cobertura 结果已成功刷新到 cobertura ser 文件 但我需要使用命令 工具 不
  • 通过 JDBC 调用 Sybase 存储过程时结果集为空

    我正在调用一个通过 JDBC 返回多个结果集的 Sybase 存储过程 我需要获取一个特定的结果集 其中有一列名为 结果 这是我的代码 CallableStatement cs conn prepareCall sqlCall cs reg
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • 全屏独占模式下的 AWT 框架在窗口弹出对话框中最小化

    我正在开发一个在全屏独占模式下使用 awt 框架的应用程序 一切正常 直到弹出窗口可见 这会抢走焦点 我的应用程序将被最小化 这是我的框架的初始化代码 if ApplicationConfig getInstance useFullscre
  • Selenium Webdriver 中显式等待 findElements

    登录后 页面重定向到一个页面 我想等待页面加载 我在其中按 tagName 查找元素 By inputArea By tagName input List
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • Apache POI 的 ProGuard 设置

    我正在构建一个使用 Apache POI 库的应用程序 当我调试应用程序 在不运行 Proguard 的情况下编译它 时 一切都运行良好 但是在导出 APK 后 当我运行应用程序并打开 Excel 文件时 出现以下异常 RuntimeExc
  • 如何更改tomcat jmx密码的文件权限

    我正在尝试保护 Windows 平台上托管的本地 tomcat 实例上的 JMX 访问 我已经创建了访问权限和密码文件 并使用以下 VM 参数插入这些文件 Dcom sun management jmxremote password fil
  • 将 Class 对象转换为字节

    如果我有一个Class http java sun com j2se 1 5 0 docs api java lang Class html在运行时实例 我可以获得它的 byte 表示形式吗 我感兴趣的字节将在类文件格式 http java
  • Spring Data elasticsearch @Query 注解嵌套对象

    我有两节课 Document public class PracticeQuestion private int userId private List
  • 使用JPanel绘制直线并获取点坐标

    我现在完全不知所措 我没有太多用 Java 构建 GUI 我一直在阅读有关 swing 和 JPanel 的所有内容 我认为我想做的事情是可能的 我只是还没有弄清楚how 我正在尝试构建一个 GUI 您可以在其中在某个绘图区域内绘制直线 我
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写
  • 如何更改MultipartFile的originalFilename

    我在服务器端有一个 MultipartFile 文件 我想更改该文件的原始文件名 但该类仅支持 getOriginalFilename 谁能帮我这个 PS 上传的是图片文件 多谢 您可以使用 MockMultipartFile 类更改名称
  • 在私有 guice 模块中公开 Map

    我在 guice 中有一个 PrivateModule 我想从该模块公开一个 Map public class TestInjectionModule extends PrivateModule expose Map class annoa

随机推荐

  • GPIO_Speed_50MHz的值是多少

    在STM32底层库中 使用GPIO Speed 50MHz等来表示输出口的最高频率 那么他的值是多少 查看了一下定义 是个枚举 后来查了一下枚举才知道 当枚举中的某个元素备赋值后 从该元素往后是递增的 即1 2 3 当赋给指定的偏移地址后
  • react中props详解

    1 props的基本使用 react组件之间的传值 是离不开props的 代码展示 export default class Parent extends Component render return div h3 我是Parent组件
  • python中if else语句用法_Python条件语句详解:if、else、switch都有了

    01 if条件语句 if语句用于检测某个条件是否成立 如果成立 则执行if语句内的程序 否则 跳过if语句 执行后面的内容 if语句的格式如下 if 表达式 语句1 else 语句2 if语句的执行过程如下 如果表达式的布尔值为真 则执行语
  • PyAutoGui图像操作(一):图像定位方式及返回

    一 PyAutoGui介绍 PyAutoGUI是Python功能强大的UI自动化库 其目的是可以用程序自动控制鼠标和键盘操作 主要用来实现PC端的UI自动化 有鼠标控制 键盘操作 屏幕截图 图片定位 消息对话框 窗口操作等功能 有倒计时 鼠
  • 使用IntelliJ IDEA开发Java Web HelloWorld

    下载Tomcat 首先 下载Apache Tomcat并解压到本地计算机 可存放于任何位置 tomcat官网 https tomcat apache org 下载稳定版版本即可 下载解压好 启动bin下的startup bat文件 访问 h
  • 图神经网络调研

    图神经网络调研 图神经网络简介 应用场景 典型模型 GCN PinSAGE GraphSAGE GAT 图神经网络与知识图谱 异质图和同质图 部分参考链接 最近在做一些图神经网络相关的课题 做了些调研 简单记录一下想法和收获 图神经网络简介
  • OSFormer阅读笔记

    目录 前言 1 模型的特点 2 模型结构 2 1 CNN backbone 2 2 位置感知Transformer LST 2 3 粗细特征融合 CFF 2 4 动态伪装实例归一化 DCIN 2 5 损失函数 3 可视化分析 参考 前言 O
  • JAVA面向过程(二十六) if-else if-else多选择结构

    语法结构 1 2 3 4 5 6 7 8 9 10 if 布尔表达式1 语句块1 else if 布尔表达式2 语句块2 else if 布尔表达式n 语句块n else 语句块n 1 当布尔表达式1为真时 执行语句块1 否则 判断布尔表达
  • 微信小程序反编译

    安装逍遥安卓模拟器 安装node js不作细述 按提示安装即可 安装完成后在命令窗口输入 node v 能查看到版本号即可 打开脚本地址下载反编译脚本 解压 安装依赖 在脚本目录下shift 鼠标右键 打开命令窗口 逐条命令安装 npm i
  • python requests请求终止,python中requests小技巧

    关于 Python requests 在使用中 总结了一些小技巧把 记录下 1 保持请求之间的Cookies 我们可以这样做 2 请求时 会加上headers 一般我们会写成这样 唯一不便的是之后的代码每次都需要这么写 代码显得臃肿 所以我
  • opencv+mfc应用程序依赖库

    msvcp110 dll msvcr110 dll vccorlib110 dll和它统计目录下的所有库 https blog csdn net seu nuaa zc article details 53525569 ucrtbased
  • PC端:hover 样式在移动端的兼容处理

    写了一个轮播 有hover效果 PC端正常显示 移动端就出现一些问题 点击之后滑动到下一张 上一张有hover效果 要点击其他地方才会消失 解决方案 参考文章CSS hover 样式在移动端的兼容处理 链滴 media hover hove
  • mysql唯一索引如何实现,从基础到源码统统帮你搞定

    面试失败之后 在这之后的很长一段时间后 他没敢再去面试 觉得自己太丢人 技术太差不敢去谈论技术话题 后来他渐渐开始看网上的文章 知道要刷leetcode 看面经 然后之后一年多的时间 边上课 边刷题 边看知识点 直到去年中旬 第二次开始面试
  • ImportError: cannot import name ‘soft_unicode‘ from ‘markupsafe‘

    打开jupyter notebook报下面的错误 这里说是markupsafe有错误 查看一下是否安装了这个包 pip show markupsafe 已经有了这个包 但是还报错 经过测试发现这个2 1 3版本不兼容 回退到2 1 0才行
  • 一文搞定Nginx的压缩、黑白名单、防盗链、零拷贝、跨域、双机热备等知识

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 每天 14 00 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框
  • C++操作SQLite数据库

    准备工作 在使用C 操作SQLite之前 需要获得sqlite3 h sqlite3 lib sqlite3 dll 大家可以在 这里 下载 并将这3个文件导入VC 工程中 其中sqlite3 dll文件放到Debug文件夹里 SQLite
  • 01一刷AD20入门教程记录

    学习视频 Altium Designer 20 19 入门到精通全38集 四层板智能车PCB设计视频教程AD19 AD20 凡亿 哔哩哔哩 bilibili 工程 安装现有元件库和封装库 AD20 1 打开优选项设置 gt Data Man
  • 分享一个多类别超实用AI工具集合网站,你想要的AI网站这里全都有

    随着Al技术的快速发展 人工智能也变成当今热门的领域之一 它正在改变着我们的生活和工作方式 今天就和大家分享一个多类别超实用AI工具集合网站 你想要的AI网站这里全都有 全网AI工具一城选择 AI 城市是一个集合了各种人工智能相关的工具和资
  • 如何判断服务器在国内还是海外?

    已知晓网站或是已知晓IP 如何判断该服务器是国内的还是海外的呢 在已知网站域名的情况下 可以通过ping网站域名来获得服务器的IP 当然有些网站是做了禁ping的 不知道IP的情况下是无法判断是国内还是海外的机器 比如咱们已知晓IP是103
  • Java响应式编程

    Java响应式编程 一 lambda表达式 1 1 lambda简介 1 2 lambda语法 1 3 FunctionalInterface 1 4 方法引用 1 5 类型推断 1 6 变量引用 1 7 级联表达式和柯里化 二 Strea