Java8方法引用和Lambda表达式实例源码+笔记分享

news2025/7/21 10:47:46

前言

Java8的lambda表达式,通过lambda表达式可以替代我们之前写的匿名内部类来实现接口。lambda表达式本质是一个匿名函数。

1、lambda表达式本质是一个匿名函数。

 1 package com.demo.main;
 2 
 3 public class LambdaMain {
 4 
 5     public static void main(String[] args) {
 6 
 7         // 1、创建一个匿名内部类
 8         Addition addition = new Addition() {
 9 
10             @Override
11             public int add(int a, int b) {
12 
13                 return a + b;
14             }
15 
16         };
17         // 传统的匿名内部类来实现接口。
18         System.out.println("调用匿名内部类来实现接口:" + addition.add(2, 3));
19 
20         // 2、Java8的lambda表达式,通过lambda表达式可以替代我们之前写的匿名内部类来实现接口。
21         // lambda表达式本质是一个匿名函数。
22         // 2.1、lambda由三部分组成,()是参数列表,->剪头符号,{}代表方法体。
23         Addition a2 = (int a, int b) -> {
24             return a + b;
25         };
26         System.out.println("lambda表达式a2:" + a2.add(3, 3));
27 
28         // 2.2、可以省略参数列表里面的参数类型
29         Addition a3 = (a, b) -> {
30             return a + b;
31         };
32         System.out.println("lambda表达式a3:" + a3.add(3, 3));
33 
34     }
35 
36     /**
37      * 
38      * @author 创建一个接口,定义一个方法
39      *
40      */
41     interface Addition {
42 
43         /**
44          * 加法的方法
45          * 
46          * @param a
47          * @param b
48          * @return
49          */
50         int add(int a, int b);
51     }
52 
53 }

2、Lambda表达式语法

形如(int a, int b) -> {return a + b;},lambda本质就是一个(匿名)函数,匿名函数,就是没有方法名称的函数。

1 一般函数结构类似,如下所示:
2 int add(int a, int b){
3     return  a + b;
4 }
5 
6 一般函数的,结构如:返回值 方法名称(参数列表) 方法体。

3、而Lamdba表达式函数

只有参数列表和方法体。结构如:(参数列表) -> {方法体};

详细说明,如下所示:

  1)、()括号用来描述参数列表。
  2)、{}大括号用来描述方法体。
  3)、->尖括号,Lambda运算符,可以叫做箭头符号,或者goes to。

4、Lambda表达式语法

关于接口方法参数、无参、单个参数、两个参数、有返回值、没有返回值的情况。如何来根据lambda来返回接口函数。

  1 package com.demo.main;
  2 
  3 public class LambdaMain {
  4 
  5     public static void main(String[] args) {
  6         // 1、无参数无返回值
  7         MethodNoReturnNoParam methodNoReturnNoParam = () -> {
  8             System.out.println("无参数无返回值");
  9         };
 10         methodNoReturnNoParam.lambda1();
 11 
 12         // 2、单个参数无返回值
 13         MethodNoReturnOneParam methodNoReturnOneParam = (int a) -> {
 14             System.out.println("单个参数无返回值,a = " + a);
 15         };
 16         methodNoReturnOneParam.lambda2(3);
 17 
 18         // 3、两个参数无返回值
 19         MethodNoReturnTwoParam methodNoReturnTwoParam = (int a, int b) -> {
 20             System.out.println("两个参数无返回值,a + b = " + (a + b));
 21         };
 22         methodNoReturnTwoParam.lambda3(3, 4);
 23 
 24         // 4、无参数有返回值
 25         MethodReturnNoParam methodReturnNoParam = () -> {
 26             return 8;
 27         };
 28         System.out.println("无参数有返回值:" + methodReturnNoParam.lambda4());
 29 
 30         // 5、一个参数有返回值
 31         MethodReturnOneParam methodReturnOneParam = (int a) -> {
 32             return a;
 33         };
 34         System.out.println("一个参数有返回值,a = " + methodReturnOneParam.lambda5(9));
 35 
 36         // 6、一个参数有返回值
 37         MethodReturnTwoParam methodReturnTwoParam = (int a, int b) -> {
 38             return a + b;
 39         };
 40         System.out.println("一个参数有返回值,a + b = " + methodReturnTwoParam.lambda6(9, 9));
 41 
 42     }
 43 
 44     /**
 45      * 1、无参数无返回值
 46      * 
 47      * @author
 48      *
 49      */
 50     interface MethodNoReturnNoParam {
 51 
 52         void lambda1();
 53     }
 54 
 55     /**
 56      * 2、单个参数无返回值
 57      * 
 58      * @author
 59      *
 60      */
 61     interface MethodNoReturnOneParam {
 62 
 63         void lambda2(int a);
 64     }
 65 
 66     /**
 67      * 3、两个参数无返回值
 68      * 
 69      * @author
 70      *
 71      */
 72     interface MethodNoReturnTwoParam {
 73 
 74         void lambda3(int a, int b);
 75     }
 76 
 77     /**
 78      * 4、无参数有返回值
 79      * 
 80      * @author
 81      *
 82      */
 83     interface MethodReturnNoParam {
 84 
 85         int lambda4();
 86     }
 87 
 88     /**
 89      * 5、一个参数有返回值
 90      * 
 91      * @author
 92      *
 93      */
 94     interface MethodReturnOneParam {
 95 
 96         int lambda5(int a);
 97     }
 98 
 99     /**
100      * 6、两个参数有返回值
101      * 
102      * @author
103      *
104      */
105     interface MethodReturnTwoParam {
106 
107         int lambda6(int a, int b);
108     }
109 
110 }

5、Lambda表达式语法

精简写法,如下所示:

  1)、参数类型可以省略。
  2)、假如只有一个参数,()括号可以省略。
  3)、如果方法体只有一条语句,{}大括号可以省略。
  4)、如果方法体中唯一的语句是return返回语句,那省略大括号的同时return关键词也要省略掉。

 1 package com.demo.main;
 2 
 3 public class LambdaMain {
 4 
 5     public static void main(String[] args) {
 6         // 1、无参数无返回值
 7         MethodNoReturnNoParam methodNoReturnNoParam = () -> System.out.println("无参数无返回值");
 8         methodNoReturnNoParam.lambda1();
 9 
10         // 2、单个参数无返回值
11         MethodNoReturnOneParam methodNoReturnOneParam = a -> System.out.println("单个参数无返回值,a = " + a);
12         methodNoReturnOneParam.lambda2(3);
13 
14         // 3、两个参数无返回值
15         MethodNoReturnTwoParam methodNoReturnTwoParam = (a, b) -> System.out.println("两个参数无返回值,a + b = " + (a + b));
16         methodNoReturnTwoParam.lambda3(3, 4);
17 
18         // 4、无参数有返回值
19         MethodReturnNoParam methodReturnNoParam = () -> 8;
20         System.out.println("无参数有返回值:" + methodReturnNoParam.lambda4());
21 
22         // 5、一个参数有返回值
23         MethodReturnOneParam methodReturnOneParam = a -> a + 10;
24         System.out.println("一个参数有返回值,a = " + methodReturnOneParam.lambda5(9));
25 
26         // 6、一个参数有返回值
27         MethodReturnTwoParam methodReturnTwoParam = (a, b) -> a + b;
28         System.out.println("一个参数有返回值,a + b = " + methodReturnTwoParam.lambda6(9, 9));
29 
30     }
31 
32     /**
33      * 1、无参数无返回值
34      * 
35      * @author
36      *
37      */
38     interface MethodNoReturnNoParam {
39 
40         void lambda1();
41     }
42 
43     /**
44      * 2、单个参数无返回值
45      * 
46      * @author
47      *
48      */
49     interface MethodNoReturnOneParam {
50 
51         void lambda2(int a);
52     }
53 
54     /**
55      * 3、两个参数无返回值
56      * 
57      * @author
58      *
59      */
60     interface MethodNoReturnTwoParam {
61 
62         void lambda3(int a, int b);
63     }
64 
65     /**
66      * 4、无参数有返回值
67      * 
68      * @author
69      *
70      */
71     interface MethodReturnNoParam {
72 
73         int lambda4();
74     }
75 
76     /**
77      * 5、一个参数有返回值
78      * 
79      * @author
80      *
81      */
82     interface MethodReturnOneParam {
83 
84         int lambda5(int a);
85     }
86 
87     /**
88      * 6、两个参数有返回值
89      * 
90      * @author
91      *
92      */
93     interface MethodReturnTwoParam {
94 
95         int lambda6(int a, int b);
96     }
97 
98 }

6、方法引用

如果多个lamdba表达式实现函数都是一样的话,可以封装成通用方法,以方便维护,此时可以使用方法引用实现。

  语法规则:对象::方法。假如是static静态方法,可以直接类名::方法。

 1 package com.demo.main;
 2 
 3 public class LambdaMain {
 4 
 5     public static void main(String[] args) {
 6 //        // 创建对象
 7 //        LambdaMain lambdaMain = new LambdaMain();
 8 //        // 采用对象引用的方式进行实现
 9 //        MethodReturnOneParam methodReturnOneParam_1 = lambdaMain::add;
10 //        System.out.println(methodReturnOneParam_1.lambda5(10));
11 //
12 //        // 采用对象引用的方式进行实现
13 //        MethodReturnOneParam methodReturnOneParam_2 = lambdaMain::add;
14 //        System.out.println(methodReturnOneParam_2.lambda5(40));
15         
16         
17         // 创建对象
18         // 采用静态对象引用的方式进行实现
19         MethodReturnOneParam methodReturnOneParam_1 = LambdaMain::addStatic;
20         System.out.println(methodReturnOneParam_1.lambda5(10));
21 
22         // 采用静态对象引用的方式进行实现
23         MethodReturnOneParam methodReturnOneParam_2 = LambdaMain::addStatic;
24         System.out.println(methodReturnOneParam_2.lambda5(40));
25     }
26 
27     /**
28      * 方法引用,如果多个lamdba表达式实现函数都是一样的话,可以封装成通用方法,以方便维护,此时可以使用方法引用实现。
29      * 
30      * @param a
31      * @return
32      */
33     public int add(int a) {
34         return a + 10;
35     }
36 
37     /**
38      * 静态方法引用
39      * 
40      * @param a
41      * @return
42      */
43     public static int addStatic(int a) {
44         return a + 10;
45     }
46 
47     /**
48      * 5、一个参数有返回值
49      *
50      * @author
51      *
52      */
53     interface MethodReturnOneParam {
54 
55         int lambda5(int a);
56     }
57 
58 }

7、构造方法引用

如果函数式接口的实现切好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用。

语法规则:类名::new。

 1 package com.demo.po;
 2 
 3 public class Dog {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15 
16     public int getAge() {
17         return age;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     @Override
25     public String toString() {
26         return "Dog [name=" + name + ", age=" + age + "]";
27     }
28 
29     public Dog(String name, int age) {
30         System.out.println("含参构造函数!");
31         this.name = name;
32         this.age = age;
33     }
34 
35     public Dog() {
36         System.out.println("无参构造函数!");
37     }
38 
39 }
 1 package com.demo.main;
 2 
 3 import com.demo.po.Dog;
 4 
 5 public class LambdaMain {
 6 
 7     public static void main(String[] args) {
 8         // 1、使用lambda表达式的方式使用
 9         DogService dogService1_0 = () -> {
10             return new Dog();
11         };
12         dogService1_0.getDog();
13 
14         // 2、简化方式
15         DogService dogService1_1 = () -> new Dog();
16         dogService1_1.getDog();
17 
18         // 3、构造方法引用,如果函数式接口的实现切好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用。
19         DogService dogService1_2 = Dog::new;
20         dogService1_2.getDog();
21 
22         // 4、构造方法引用,有参构造函数调用
23         DogService2 dogService2_1 = Dog::new;
24         dogService2_1.getDog("小黄", 2);
25 
26     }
27 
28     interface DogService {
29 
30         /**
31          * 获取到一只无名狗
32          * 
33          * @return
34          */
35         Dog getDog();
36     }
37 
38     interface DogService2 {
39 
40         /**
41          * 获取到一个有名称的狗
42          * 
43          * @param name
44          * @param age
45          * @return
46          */
47         Dog getDog(String name, int age);
48     }
49 
50 }

8、集合使用lambda表达式对数据进行排序,遍历等操作

对于参数是接口函数的方法,需要传递lamdba表达式作为参数进行调用。

 1 package com.demo.main;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.demo.po.Dog;
 7 
 8 public class LambdaMain {
 9 
10     public static void main(String[] args) {
11         List<Dog> list = new ArrayList<Dog>();
12         list.add(new Dog("小黄", 5));
13         list.add(new Dog("小花", 4));
14         list.add(new Dog("旺财", 3));
15         list.add(new Dog("团团", 2));
16         list.add(new Dog("圆圆", 1));
17 
18         // 排序
19         System.out.println("lambda集合排序!!!");
20         // sort的参数是接口函数,需要使用lambda表达式匿名函数形式
21         list.sort((dog1, dog2) -> dog1.getAge() - dog2.getAge());
22         System.out.println(list);
23         System.out.println();
24 
25         // 遍历集合
26         System.out.println("lamdba集合遍历:");
27         list.forEach(System.out::println);
28     }
29 
30 }

9、@FunctionalInterface注解

此注解是函数式接口注解,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。
特点:

  1)、接口有且仅有一个抽象方法。
  2)、运行定义静态方法。
  3)、允许定义默认方法。
  4)、允许java.lang.Object中的public方法。
  5)、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好的让编译器进行检查。如果编写的不是函数时接口,但是加上该注解,那么编译器会报错。

 1 package com.demo.main;
 2 
 3 public class LambdaMain {
 4 
 5     public static void main(String[] args) {
 6         FunctionInterface functionInterface = (int a) -> {
 7             System.out.println("a = " + a);
 8         };
 9         functionInterface.add(10);
10     }
11 
12     /**
13      * 正确的函数式接口
14      * 
15      * @author biexiansheng
16      *
17      */
18     @FunctionalInterface
19     interface FunctionInterface {
20 
21         /**
22          * 抽象方法
23          */
24         public void add(int a);
25 
26         /**
27          * java.lang.Object中的public方法
28          * 
29          * @param var
30          * @return
31          */
32         public boolean equals(Object var);
33 
34         // 默认的方法
35         public default void defaultMethod() {
36             System.out.println("默认的方法!!!");
37         }
38 
39         // 静态方法
40         public static void staticMethod() {
41             System.out.println("静态的方法!!!");
42         }
43 
44     }
45 
46 }

10、系统内置函数式接口

Java8的推出,是以lamdba重要特性,一起推出的,其中系统内置了一系列函数式接口。在jdk的java.util.function包下,有一系列的内置函数式接口:

 1 package com.demo.main;
 2 
 3 import java.util.function.IntConsumer;
 4 import java.util.function.IntFunction;
 5 import java.util.function.IntPredicate;
 6 
 7 public class LambdaMain {
 8 
 9     public static void main(String[] args) {
10         // 在jdk的java.util.function包下,有一系列的内置函数式接口
11         // 1、使用int函数接口
12         IntFunction<Integer> intFunction = (a) -> {
13             return a + 10;
14         };
15         System.out.println(intFunction.apply(20));
16         
17         // 2、使用int判断函数接口
18         final int aa = 20;
19         IntPredicate intPredicate = (a) -> {
20             return a == aa;
21         };
22         System.out.println(intPredicate.test(aa));
23         
24         // 3、使用int传递参数的形式
25         IntConsumer intConsumer = (a) -> {
26             System.out.println("a = " + a);
27         };
28         intConsumer.accept(20);
29         
30         // 书写技巧:首先定义一个接口函数对象,然后后面跟lambda表达式。
31         // lambda参数列表根据接口函数的方法参数类型和参数个数。
32         // lambda的方法体,是否有返回值,根据接口函数的方法是否有返回值。
33     }
34 
35 }

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

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

相关文章

环辛炔衍生物DBCO-NH2,amine,Acid,NHS,Maleimide无铜点击反应

DBCO对叠氮化物具有非常高的反应选择性&#xff0c;可用于修饰生物分子&#xff0c;包括肽、蛋白质、酶、活细胞、整个生物体等。在生理温度和pH值范围内&#xff0c;DBCO基团不与胺或羟基反应&#xff0c;DBCO也与叠氮化物基团发生反应DBCO也称为ADIBO&#xff08;氮杂二苯并环…

2022.11.15-二分图专练

目录 50 years, 50 colors(HDU-1498) Uncle Toms Inherited Land*(HDU-1507) Matrix(HDU-2119) Arbiter(HDU-3118) [ZJOI2007]矩阵游戏(黑暗爆炸1059) Jimmy’s Assignment(HDU-1845) 50 years, 50 colors(HDU-1498) 原题链接:传送门 题意:一个n*n的矩阵中&#xff0c;…

第四章. Pandas进阶—数据格式化

第四章. Pandas进阶 4.1 数据格式化 1.设置小数位数(round函数) DataFrame.round(decimals0&#xff0c;*args&#xff0c;**kwargs)参数说明: decimals:用于设置保留的小数位数 args&#xff0c;kwargs:附加关键字的参数 返回值&#xff1a;返回DataFrame对象 1).示例&#…

HTML常用标签的使用

HTML常用标签的使用 文章目录HTML常用标签的使用1.排版标签1.1 标题标签&#xff08;h&#xff09;1.2 段落标签&#xff08;p&#xff09;1.3 换行标签&#xff08;br&#xff09;1.4 水平线标签&#xff08;hr&#xff09;2.文本格式化标签&#xff08;strong、ins、em、del&…

Vue(七)——Vue中的Ajax

目录 Vue脚手架配置代理 插槽 默认插槽 具名插槽 作用域插槽 Vue脚手架配置代理 本案例需要下载axios库&#xff1a;npm install axios 1.配置类方式(实现WebMvcConfigurer) 2.使用CrossOrigin注解 3.使用nginx反向代理解决跨域 4.Vue中配置代理服务器 代理服务器怎…

懒人的法宝——办公自动化!

没错&#xff01;办公自动化他来了&#xff01;果然&#xff0c;代码都是懒人发明出来的。接下来让我们一起来看看这个批改作业的自动化脚本吧&#xff01;学会了这种思想可以帮助我们高效解决许多重复性的工作&#xff0c;比如说批量修改文件的名称、类型、位置等等&#xff0…

【附源码】计算机毕业设计JAVA计算机系教师教研科研管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

计算机网络-网络层(BGP协议,IP组播,IGMP协议与组播路由选择协议)

文章目录1. BGP协议BGP协议报文格式2. RIP&#xff0c;OSPF&#xff0c;BGP协议对比3. IP组播4. IGMP协议与组播路由选择协议1. BGP协议 与其他自治系统的邻站BGP发言人&#xff08;BGP边界路由器&#xff09;交换信息 BGP边界路由器之间交换网络可达性的信息&#xff0c;即要…

C++Qt开发——SMTP协议

1. SMTP协议简介 SMTP协议&#xff1a;全称为 Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间&#xff0c;以及两台SMTP邮件服务器之间的通信规则。 SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的…

网络安全之命令执行漏洞复现

0x01 漏洞介绍 漏洞等级&#xff1a;严重 Webmin是功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。在版本1.997之前的Webmin中存在一个任意命令注入漏洞&#xff0c;触发该漏洞需登录Webmin。 0x02 漏洞影响范围 …

GitHub最新发布 阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯&#xff0c;大家好&#xff01; 没错&#xff0c;又是我&#xff0c;还跟前面一样&#xff0c;有好东西我才会出现。那是什么好东西呢&#xff1f;今天啊&#xff0c;给他分享阿里在Github最新发布的spring全家桶笔记第九版&#xff0c;这份笔记一共分三份&#xff1a;sp…

自学前端开发 - VUE 框架 (二):渲染、事件处理、表单输入绑定、生命周期、侦听器、组件基础

[TOC](自学前端开发 - VUE 框架 (二) 事件处理、表单输入绑定、生命周期、侦听器、组件基础) 事件处理 可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件&#xff0c;并在事件触发时执行对应的 JavaScript。用法&#xff1a;v-on:click"methodName" 或 click"ha…

音视频进阶知识

亮度方程 亮度方程给出彩色光的亮度Y与三基色&#xff08;R、G、B&#xff09;的关系式Y1.0000R4.5907G0.06015B 在不同的彩色电视制式中&#xff0c;由于所选的标准白光和显像三基色不同&#xff0c;导致亮度方程也互有差异。 以C光为标准白光源的NTSC制彩色电视制式的亮度方程…

[java/初学者/GUI编程]GUI界面设计——界面组件类

前言 GUI&#xff0c;即图形用户界面&#xff0c;其英文全称是Graphics User Interface。 它是基于图形的界面,windows就是一个图形用户界面的操作系统,而DOS是基于命令提示符的操作系统,GUI编程就是编出一个图形用户界面的软件&#xff0c;它使用图形的方式&#xff0c;以菜…

昇思MindSpore时序AI SIG,共同提高序列大数据分析能力

随着信息产业技术的升级&#xff0c;产生了大规模的时间序列数据&#xff0c;长期并广泛存在于工业制造、航空航天、公共卫生、环境保护等关键基础领域。时间序列信息能够被充分理解、计算和利用&#xff0c;实现精准预测并辅助决策&#xff0c;是关系到国家竞争力的重要问题。…

Adaptive Cruise Control (ACC) Test Scenarios(PreScan里面的ACC)

文章目录Adaptive Cruise Control (ACC) Test Scenarios PreScan scenario models available with the ACC system ACC模型的几个预扫描场景可用&#xff1a; 真实生活场景–系统的典型用例 ISO测试协议 这些模型展示了如何使用PreScan对ADAS系统进行建模&#xff0c;并提供“…

Day 56 | 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇

583. 两个字符串的删除操作 解法一&#xff1a;直接求删除的步数 动态规划解题思路&#xff1a; ①确定dp数组以及下标含义 dp[i][j]&#xff1a;以下标i-1结尾的字符串s与下标j-1结尾的字符串t想要达到相等&#xff0c;所需要删除元素的最少次数。 ②确定递推公式 每次…

spring - AnnotationConfigApplicationContext启动之reader、scanner、register逻辑整理

前言 我们在使用spring framework时一般都喜欢按照以下方式写启动 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class); 而我们的AnnotationConfigApplicationContext的内容如下 public AnnotationConfigAp…

长时间预测模型DLiner、NLiner模型(论文解读)

前言 今年发布8月份发布的一篇有关长时间序列预测&#xff08;SOTA&#xff09;的文章&#xff0c;DLiner、NLine在常用9大数据集&#xff08;包括ETTh1、ETTh2、ETTm1、ETTm2、Traffic等&#xff09;上MSE最低&#xff0c;模型单变量、多变量实验数据&#xff1a; 在计算资…

Appium学习日记(二)—— 入门学习(安装Appium和配置环境)

入门 1、安装 Node.js 进入nodejs的官网下载安装包安装&#xff0c;一路点击下一步就行。 安装完毕之后&#xff0c;打开命令行&#xff0c;输入&#xff1a;node -v;显示类似于v10.13.0的版本号信息则表示安装成功。 2、安装Appium以及相关环境配置 Appium可以通过两种方式之…