Java 复习笔记 - Lambda 表达式 he 经典算法题
文章目录
- Lambda表达式 概述
- (一)基本作用
- (二)特点
- 一,初识Java中的Lambda 表达式
- 二,函数式编程
- 三,省略写法
- 四,练习:使用Lambda 表达式 简化Comparator接口的匿名形式
- 综合练习
- 一,按照需求进行排序
- 二,不死神兔
- 三,猴子吃桃
- 四,爬楼梯
Lambda表达式 概述
Lambda 表达式(Lambda Expressions)是一种简洁的表示匿名函数(anonymous function)的方法,它允许将函数作为方法的参数(MOP,Method Ordered Parameters)或者代码中的一部分进行传递。这种表达式在 Python、JavaScript、Java 等多种编程语言中都有应用。
(一)基本作用
Lambda表达式在Java和其他函数式编程语言中有着广泛的应用。其主要作用包括:
- 简化代码:Lambda表达式可以作为参数传递给其他函数,或者在函数中创建简短、可读性更高的代码,这样可以帮助减少代码量,并提升代码的可读性和可维护性。
- 函数式编程:Lambda表达式使得函数式编程在Java中变得可能。函数式编程强调将计算作为数学上的函数求值,避免改变状态和使用可变数据。通过Lambda表达式,可以更方便地实现函数式接口。
- 匿名函数:Lambda表达式是一种匿名函数,可以作为参数传递给其他函数,或者在函数中作为代码片段直接使用,而不需要定义一个显式的函数名称。
- 提升代码可维护性:由于Lambda表达式可以使代码更加简洁和模块化,这使得代码更容易理解和维护。
总的来说,Lambda表达式是一种强大的工具,可以使代码更简洁,更易读,更模块化,从而提升代码的可维护性和可重用性。
(二)特点
Lambda表达式是Java 8中最重要的新功能之一,它有以下几个特点:
- 函数式编程:Lambda表达式可以替代只有一个抽象函数的接口实现,它是一种函数式编程的方式,可以帮助我们编写更简洁易懂的代码。
- 参数类型自动推断:Lambda表达式中的参数类型可以自动推断,不需要显式地指定类型。
- 代码量少、简洁:使用Lambda表达式可以将代码量减少,使代码更加简洁易懂。Lambda表达式的语法也很简洁,易于编写和阅读。
Lambda表达式的应用场景非常广泛,它可以应用于任何有函数式接口的地方,例如集合、框架的迭代、遍历、过滤数据的操作等。
一,初识Java中的Lambda 表达式
下面是一个简单的Java Lambda表达式的示例,它使用Lambda表达式来实现一个简单的接口方法:
interface MyInterface {void doSomething();
}public class LambdaExample {public static void main(String[] args) {// 使用Lambda表达式实现MyInterface接口的doSomething方法MyInterface myLambda = () -> System.out.println("Hello Lambda!");// 调用MyInterface接口的doSomething方法myLambda.doSomething();}
}
输出:
Hello Lambda!
在这个示例中,定义了一个MyInterface接口,它只有一个没有参数的doSomething方法。然后在main方法中使用Lambda表达式来创建一个实现该接口的对象,并将其赋值给myLambda变量。最后,调用myLambda对象的doSomething方法,该方法会输出“Hello Lambda!”。
二,函数式编程
函数式编程是一种编程范式,它将计算视为数学上的函数求值,并避免改变状态和使用可变数据。在 Java 中,函数式编程的主要特点包括:
- 不可变性(Immutability): 在函数式编程中,一旦一个变量被赋值,你就不能改变它。这意味着你不能更改变量的状态,这也被称为“不可变性”。
- 纯函数(Pure Functions): 纯函数是一种既不改变外部状态也不依赖外部状态的函数,它给定相同的输入就会产生相同的输出,而且没有任何副作用。
- 高阶函数(Higher-Order Functions): 高阶函数是接受一个或多个函数作为输入(参数)或返回一个函数作为结果的函数。
Java 8 引入了 Lambda 表达式和函数式接口,使得 Java 编程语言更加支持函数式编程。以下是一些 Java 8 之后的函数式编程例子:
Lambda 表达式:
Lambda 表达式是一种简洁的表示匿名函数的方法,它没有名称,但有参数列表,函数主体,返回类型,并且可以被赋值给变量或传递给方法作为参数。
例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 lambda 表达式实现过滤功能
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
在这个例子中,n -> n % 2 == 0
就是一个 Lambda 表达式,它实现了 Filter<Integer>
接口的 test
方法。
函数式接口:
函数式接口是只有一个抽象方法的接口。Java 8 中的 FunctionalInterface
注解可以标记这样的接口。
例如:
@FunctionalInterface
interface GreetingService {void sayMessage(String message);
}
然后,你可以使用 Lambda 表达式或方法引用实现这个接口:
GreetingService greetService1 = message -> System.out.println("Hello " + message);
GreetingService greetService2 = System.out::println;
greetService1和
greetService2都实现了
GreetingService接口的
sayMessage` 方法。
三,省略写法
Lambda表达式可以省略一些元素以使代码更简洁,以下是Lambda表达式的一些省略写法:
- 参数类型可以省略不写。如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"。
以上就是Lambda表达式的一些省略写法,这些规则的使用可以使你的代码看起来更加简洁易读。
下面展示一个Java Lambda表达式的省略写法示例:
List<String> list = Arrays.asList("Apple", "Banana", "Orange");// 原始Lambda表达式
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);// 省略参数类型的Lambda表达式
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);// 省略大括号和分号的Lambda表达式
list.stream().filter(s -> s.startsWith("A")).forEach(s -> System.out.println(s));// 省略return语句的Lambda表达式
list.stream().filter(s -> s.startsWith("A")).forEach(s -> System.out.println(s));
这个示例中,创建了一个字符串列表,并使用Lambda表达式对列表进行过滤和输出。在第一个Lambda表达式中,没有省略任何内容。在第二个Lambda表达式中,省略了参数类型。在第三个Lambda表达式中,省略了大括号和分号。在第四个Lambda表达式中,省略了return语句。
四,练习:使用Lambda 表达式 简化Comparator接口的匿名形式
需求:定义数组并存储一些字符串,利用Arrays中的sort方法进行排序,按照字符串的长度进行排序,短的在前面,长的在后面(暂时不比较字符串里面的内容)。
在Java中,可以使用Lambda表达式和Comparator接口来简化排序操作。以下是按照字符串长度进行排序的示例:
import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {// 定义并初始化字符串数组String[] strings = {"Java", "Python", "C", "JavaScript", "Go"};// 使用Lambda表达式和Comparator接口进行排序Arrays.sort(strings, Comparator.comparingInt(String::length));// 打印排序后的数组for (String str : strings) {System.out.println(str);}}
}
在这个示例中,Comparator.comparingInt(String::length)
是一个Lambda表达式,它实现了Comparator接口的compare方法。这个表达式接受两个字符串参数,并通过调用String::length
方法获取它们的长度,然后比较这两个长度值。
这个Lambda表达式相当于下面的匿名类实现:
Arrays.sort(strings, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length());}
});
使用Lambda表达式可以简化代码,并提高代码的可读性。
综合练习
一,按照需求进行排序
需求:定义数组并存储一些朋友对象,利用Arrays中的sort方法进行排序。
属性有姓名、年龄和身高。
按照年龄的大小进行排序,年龄一样,按照升高排序,身高一样按照姓名的字母进行排序(姓名中不要有中文或特殊字符)。
在Java中,可以创建一个Friend
类来存储朋友的姓名、年龄和身高,然后使用Arrays.sort()
方法和Lambda表达式来排序。
首先,创建一个Friend
类:
public class Friend {private String name;private int age;private double height;public Friend(String name, int age, double height) {this.name = name;this.age = age;this.height = height;}public String getName() {return name;}public int getAge() {return age;}public double getHeight() {return height;}@Overridepublic String toString() {return "Friend{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}
然后,你可以创建一个Friend
数组并排序:
import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {Friend[] friends = new Friend[]{new Friend("Alice", 25, 160.5),new Friend("Bob", 20, 175.2),new Friend("Charlie", 23, 170.0),new Friend("David", 20, 172.0),new Friend("Eve", 25, 155.0)};Arrays.sort(friends, Comparator.comparingInt((Friend f) -> f.getAge()).thenComparingDouble(f -> f.getHeight()).thenComparing(f -> f.getName()));for (Friend friend : friends) {System.out.println(friend);}}
}
在这个例子中,Arrays.sort()
方法使用一个自定义的比较器来排序。比较器首先比较年龄,如果年龄相同,则比较身高,如果身高也相同,则比较姓名。
二,不死神兔
需求:有个很有名的数学逻辑题叫做不死神兔问题,有一対兔子,从出生到第三个月起每个月都生一对兔子,小兔子长到第三个月后又生一对兔子,假设兔子都不死,问第十二个月的兔子对数为多少?
这是一个经典的斐波那契数列问题,下面是一个的Java示例,可以计算第十二个月的兔子对数:
public class RabbitProblem {public static void main(String[] args) {int months = 12;int[] rabbitPairs = new int[months];// 初始化前三个月的兔子对数rabbitPairs[0] = 1;rabbitPairs[1] = 1;rabbitPairs[2] = 1;// 计算后九个月的兔子对数for (int i = 3; i < months; i++) {rabbitPairs[i] = rabbitPairs[i - 1] + rabbitPairs[i - 2];}// 输出第十二个月的兔子对数System.out.println("第十二个月的兔子对数为:" + rabbitPairs[months - 1]);}
}
这段代码首先定义了一个长度为12的数组,用于存储每个月的兔子对数。然后,初始化前三个月的兔子对数,都是1对。接着,使用一个循环计算后九个月的兔子对数,每个月的兔子对数等于前两个月的兔子对数之和。最后,我们输出第十二个月的兔子对数。
三,猴子吃桃
需求:有一个猴子摘了一堆桃子,第一天吃了一半,嘴馋又多吃了一个,第二天吃剩余的一半,同样嘴馋多吃了一个,第三天亦然,第10天的时候(还没有吃),发现只剩下一个桃子了,问这个猴子摘了多少桃子?
这是一个经典的数学问题,可以用递归或者循环来解决。这里我们给出使用循环的Java代码。
public class MonkeyPeach {public static void main(String[] args) {int day = 10;int peach = 1; // 第10天有1个桃子for (int i = 1; i < day; i++) {// 每一天猴子都吃前一天剩下的一半再加一个peach = (peach + 1) * 2;}System.out.println("猴子摘了 " + peach + " 个桃子");}
}
四,爬楼梯
需求:帅气的小明喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶。如果这个楼梯有20个台阶,小明一个共有多少种爬法?
运行结果:
1层台阶 1种爬法
2层台阶 2种爬法
7层台阶 21种爬法
这个问题实际上是一个经典的动态规划问题,类似于斐波那契数列问题。小明爬楼梯的方式实际上就是斐波那契数列的表现形式,即F(n) = F(n-1) + F(n-2)
。
以下是一段Java代码,可以计算出小明爬20层楼梯有多少种爬法:
public class Main {public static void main(String[] args) {int n = 20;System.out.println(n + "层台阶 " + climbStairs(n) + "种爬法");}public static int climbStairs(int n) {if (n <= 2) {return n;}int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
}
在这段代码中,climbStairs
函数会计算出爬n层楼梯有多少种爬法。这个函数首先处理了小于等于2的情况,然后用动态规划的方式计算出了大于2的情况。动态规划的思路是,爬到第i层的方法数等于爬到第i-1层的方法数加上爬到第i-2层的方法数。最后,这个函数返回了爬到n层的方法数。
相关文章:
Java 复习笔记 - Lambda 表达式 he 经典算法题
文章目录 Lambda表达式 概述(一)基本作用(二)特点 一,初识Java中的Lambda 表达式二,函数式编程三,省略写法四,练习:使用Lambda 表达式 简化Comparator接口的匿名形式综合…...
算法——快乐数
202. 快乐数 - 力扣(LeetCode) 由图可知,其实这也是一个判断循环的过程,要用到快慢指针,且相遇后,若在全为1的循环里,那么就是快乐数,若相遇后不为1,说明这不是快乐数。 …...
vue使用window.location.href 跳转失败
问题: vue项目中直接使用window.lcocation.href跳转外链,但是跳转的链接会被拼接成这样 http://localhost:8080/#/www.baidu.com 原因: 我们打开的外部链接会自动拼接我们的源地址,导致网址链接不正确,无法正常访问 …...
【备忘】清理Office缓存
【背景】电脑安装了M365 Apps for enterprise的客户端,遇到不常见的奇怪问题。尝试看清理缓存是否可以解决。 【清理步骤】 1. 关闭所有Office365 应用; 2. 搜索 %AppData% ,并打开该文件夹; 3. 进到 AppData > Local > M…...
MacOS环境变量source生效但重启后又失效
https://blog.csdn.net/dxk539687357/article/details/127942044 .bash_profile 和 .zshrc 都是macos系统重环境变量配置的文件,但是两者有不同之处。 .bash_profile:在执行source ~/.bash_profile,只在当前窗口生效,但关闭当前…...
Sql语句大全--插入
今天抽空整理下项目中的Sql语句 项目中用到的Sql语句大全 Insert 语句,有简有难 Insert 语句,有简有难 insert into clayor (pco,ppolnum,ptype,psn,prela,pname,pid,paddr1,paddr2,pbakcod1,pbakcod2,paccnum,pchkflag,pagtcod,pstatus, pchksts,pauth…...
Unity 收取“运行费”引众怒,开源免费3D游戏引擎CGE(Castle Game Engine)吸引开发者关注
特征 1. 总结2. 跨平台3. 可视化编辑器4.视口与场景,相机,导航和其他组件5. 数据格式 5.1. glTF5.2. X3D5.3. 精灵表5.4. 脊柱6. 图形效果7. 图片8. 用户界面组件 8.1. 文本和字体9. 网络10. 优化和分析11. 声音12. 物理13. 平铺集成14. 粒子15. 使用现代…...
Apache DolphinScheduler - 快速扩展 TaskPlugin 从入门到放弃
目前在大数据生态中,调度系统是不可或缺的一个重要组件。Apache DolphinScheduler 作为一个顶级的 Apache 项目,其稳定性和易用性也可以说是名列前茅的。而对于一个调度系统来说,能够支持的可调度的任务类型同样是一个非常重要的因素…...
线性代数的本质(四)——行列式
文章目录 行列式二阶行列式 n n n 阶行列式行列式的性质克拉默法则行列式的几何理解 行列式 二阶行列式 行列式引自对线性方程组的求解。考虑两个方程的二元线性方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1 \\ a_{21}x_…...
适合初学者快速入门的Numpy实战全集
适合初学者快速入门的Numpy实战全集 Numpy是一个用python实现的科学计算的扩展程序库,包括: 1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C和Fortran代码的工具包;…...
rabbitmq 面试题
1.交换机类型 RabbitMQ是一个开源的消息队列系统,它支持多种交换机类型,用于在消息的生产者和消费者之间路由和分发消息 Direct Exchange(直接交换机):Direct交换机是最简单的交换机类型之一。它将消息按照消息的Rout…...
比较Visual Studio Code中的文件
目录 一、比较两个文件 1.1VS code中的文件大致分为两类: 1.2如何比较VS code中的两个文件? 二、并排差异模式:VS code中的一种差异模式 三、内联差异模式:VS code中的另一种差异模式 四、VS code忽略在行首或者行尾添加或删除…...
誉天在线项目-UML状态图+泳道图
什么是UML UML(Unified Modeling Language)是一种用于软件系统建模的标准化语言。它提供了一组图形符号和规范,用于描述和设计软件系统的结构、行为和交互。 UML图形符号包括类图、用例图、时序图、活动图、组件图、部署图等,每…...
【linux基础(六)】Linux中的开发工具(中)--gcc/g++
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:Linux从入门到开通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学更多操作系统知识 🔝🔝 Linux中的开发工具 1. 前言2.…...
u盘上面 安装 ubuntu 系统
u盘上面 安装 ubuntu 系统 下载 一个 Ubuntu 22.04.3 LTS 桌面版 https://ubuntu.com/download/desktop 找到一个U盘 参考文章: 把 Ubuntu 装到U盘里随身携带,并同时支持 BIOS 和 UEFI 启动 https://www.luogu.com.cn/blog/GGAutomaton/portable-ubu…...
【推荐】SpringMVC与JSON数据返回及异常处理机制的使用
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《【推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想,为了不断更新自己 ! 1.JSON 在SpringMVC中,JSON数据返回通常是通过使用ResponseBody注解将Java对象转换为JSO…...
SpringBoot新增拦截器详解
目录 一、拦截器使用 二、SpringMvc拦截器接口 三、SpringBoot集成拦截器 拦截器(Interceptor)通常是指在软件开发中用于处理请求和响应的中间件组件。拦截器的主要目的是在请求进入某个处理流程或在响应返回给客户端之前执行一些额外的操作或逻辑。 …...
Golang开发--select
在Go语言中,select语句用于在多个通道操作中进行选择。select语句使得程序可以同时等待多个通道的操作,并在其中任意一个通道就绪时执行相应的操作。以下是select语句的详细描述: select { case <-ch1:// 当ch1通道可读时执行的操作 case…...
贝塞尔曲线的一些资料收集
一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。 https://pomax.github.io/bezierinfo/zh-CN/index.html An algorithm to find bounding box of closed bezier curves? - Stack Overflow https://stackoverflow.com/questions/2587751/an-algo…...
计算机网络原理 运输层
一,运输层协议概述 1,进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络边缘部分的两台主机使用网络核心部分的功能进行…...
【JavaEE】多线程案例-阻塞队列
1. 前言 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空当队列满时,存储元素的线程会等待队列可用 阻塞队列常用于生产者和消费者的场…...
【物联网】简要介绍最小二乘法—C语言实现
最小二乘法是一种常用的数学方法,用于拟合数据和寻找最佳拟合曲线。它的目标是找到一个函数,使其在数据点上的误差平方和最小化。 文章目录 基本原理最小二乘法的求解应用举例使用C语言实现最小二乘法总结 基本原理 假设我们有一组数据点 ( x 1 , y 1 …...
慢查询SQL如何优化
一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录,它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…...
UART 通信-使用VIO进行板级验证
串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 文章目录 前言一、uart串口协…...
linux 查看可支持的shell
查看可支持的shell linux中支持多种shell类型,所以在shell文件的第一行需要指定所使用的shell #!/bin/bash 指定该脚本使用的是/bin/bash,这样的机制使得我们可以轻松地引用任何的解释器 查看该linux系统支持的shell cat /etc/shells/bin/sh/bin/bash/us…...
微服务简介
微服务简介 微服务架构是一种软件架构模式,它将一个大型应用程序拆分为一组小型、独立的服务,每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展,通常使用HTTP或其他轻量级通信协议进行通信。 以下是微服务架构的一…...
PHP自己的框架2.0设置常量并绑定容器(重构篇三)
目录 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 3、将常量绑定到容器中 4、运行效果 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 //设置当前容器的实例public static function setInstance($instance){…...
重建大师提交空三后引擎状态是等待,怎么开启?
答:图片中这是在自由网空三阶段,整个AT都是等待中,可以修改任务目录和监控目录看一下,先设置引擎,再提交空三。...
【数据结构】堆的向上调整和向下调整以及相关方法
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 文章目录 一、堆的概念二、堆的性质…...
【蓝桥杯选拔赛真题60】Scratch旋转风车 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
目录 scratch旋转风车 一、题目要求 编程实现 二、案例分析 1、角色分析...
烟台市做网站找哪家好/网上怎么推销自己的产品
wechathook借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取注入器注入dll进程序中DLL实现hook功能,申请内存,修改call,在里面写调用python逻辑Python代码为了方便调用和后…...
祥云网站建设/搜狗推广效果好吗
好久没有写博客了,这次准备写写我这几天的研究成果——Android插件化开发框架CJFrameForAndroid。 好久没有写博客了,这次准备写写我这几天的研究成果——Android插件化开发框架CJFrameForAndroid。背景交代 首先。你须要知道什么是插件化开发。就拿最常…...
怎么做网站不会被屏蔽/电商平台发展现状与趋势
1、添加项目 2、选择maven-archetype-webapp 3、添加公司/组织名称,项目名称,版本号 4、补全未生成的文件夹 5、pom.xml中添加jetty插件信息 [html] view plaincopy <plugins> <plugin> <groupId>org.mortbay.jetty</groupId&…...
郑州品牌营销网站建设/可以进入任何网站的浏览器
在本篇文章中,我收集了很多经验和方法。应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码。简介在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级JPEG库。期间,我总结了…...
可以做3d电影网站有哪些/友情链接交换统计表
SDK版本:SIMPLELINK_CC13X2_26X2_SDK v5.20.0.52 适用场景:首次将工程文件配置到本地时;有bim工程、oad工程、协处理器程序多个部分混杂; 异常问题:MENU_ITEM_MULTIPLE_ACTIONS(spMenuSelectConn, MAX_NUM_BLE_CONNS…...
做银行设计有好的网站参考吗/建站推广
学什么,比穿什么衣服的问题更难,因为职业的背后,更多的是抉择而不是选择,选错一件衣服可以重来,而选错一个职业所面对的结果,是非常让人痛苦的。本文是小千对想转行IT行业的你最真挚的建议。对于任何一个人…...