Map集合、Stream流、File类、递归
1|0一,JDK8新特性:Stream
1|11,认识Stream
-
也叫Stream流,是jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。
-
优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
案例需求:有一个List集合,元素有"河南大学","郑州大学","河南科技大学","黄淮学院","华北水利水电大学","河南工业大学","河南农业大学"
,找出河南开头,且是6个字的校名,存入到一个新集合中去。
用传统方式来做,代码是这样的
用Stream流来做,代码是这样的(ps: 是不是想流水线一样,一句话就写完了)
下面我们就把目光定睛在Stream流的获取,对流的处理,以及总结方法。
1|22,Stream流的创建
总结:Collection接口的实现类都可以通过对象调用stream( ) 方法来获取Stream对象。而对于map这个特殊的集合只能先获取其keys或values的对象,得到一个集合然后在调用其中的Stream对象 。当然也可以通过内部对键值对的封装的Set集合获取Stream对象。
而对于数组可以通过Arrays.stream()方法来获取。
对于不太确定或者已经确定的数据都可以视同Stream类的静态方法 of()来获取对象。很香。类比于Collections的addAll方法。
1|33,Stream的常用方法
上面学习了Stream流的获取,下面再学习 第二步,Stream流常见的中间方法。
Stream****提供的常用中间方法 | 说明 |
---|---|
Stream |
用于对流中的数据进行过滤。 |
Stream |
对元素进行升序排序 |
Stream |
按照指定规则排序 |
Stream |
获取前几个元素 |
Stream |
跳过前几个元素 |
Stream |
去除流中重复的元素。 |
对元素进行加工,并返回对应的新流 | |
static |
合并a和b两个流为一个流 |
通过下面的代码做一个练习:
下面的代码大量的运用lambda,如果没有学,可以看前面的笔记,有详细的介绍。对于lambda表达式中filter方法。可以这样理解其他的也类似。s -> s >= 60 前面代表当前对象,后面的代表的是条件,也就是只有当后面成立的时候(为true)才会将当前的元素,添加到Stream流中。基本都是这种思想
还有一个map方法:这个方法用于对值进行操作然后得到返回之后的数据添加到Stream流中的。也很常用
1|44,Stream流终结方法(重点)
终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。
Stream****提供的常用终结方法 | 说明 |
---|---|
void forEach(Consumer action) | 对此流运算后的元素执行遍历 |
long count() | 统计此流运算后的元素个数 |
Optional |
获取此流运算后的最大值元素 |
Optional |
获取此流运算后的最小值元素 |
1|55,收集Stream流
收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。
Stream流:方便操作集合/数组的手段; 集合/数组:才是开发中的目的
Stream 提供的常用终结方法 | 说明 |
---|---|
R collect(Collector collector) | 把流处理后的结果收集到一个指定的集合中去 |
Object[] toArray() | 把流处理后的结果收集到一个数组中去 |
Collectors 工具类提供了具体的收集方式 | 说明 |
---|---|
public static |
把元素收集到List集合中 |
public static |
把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) |
把元素收集到Map集合中 两个参数分别为每一个k和每一个v |
2|0二,File类
要使用类和之前的思路一样,肯定是要获取到对象。两种方法,一种是通过静态方法,另一种就是通过构造方法。File不能通过静态方法获取的对象。那么就是构造方法啦,下面就来学习构造方法
构造器 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent, String child) | 根据父路径和子路径名字创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字创建文件对象 |
注意:
- File既可代表文件,也可以代表文件夹。File封装的对象仅仅是一个路径名称,这个路径可以是存在也可以是不存在的,也允许<这个到后面的io就会理解,因为如果不存在那么java会帮我们创建>
- 需求我们注意的是:路径中"\"要写成"\\", 路径中"/"可以直接用
示例代码:
在学习方法之前还需要了解两个概念绝对路径和相对路径:<在后面常用>:
2|1绝对路径:
相对于盘符,即 C盘,D盘
2|2相对路径:
在idea中是相对于项目目录:
下面就来学习相对方法:
2|3常用方法1:判断文件类型,获取文件信息
方法名称 | 说明 |
---|---|
public boolean exists() | 判断当前文件对象,对应的文件路径是否存在,存在返回true |
public boolean isFile() | 判断当前文件对象指代的是否是文件,是文件返回true,反之。 |
public boolean isDirectory() | 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。 |
public String getName() | 获取文件的名称(包含后缀) |
public long length() | 获取文件的大小,返回字节个数 |
public long lastModified() | 获取文件的最后修改时间。 |
public String getPath() | 获取创建文件对象时,使用的路径 <也就是构造器中的路径,给相对就是相对> |
public String getAbsolutePath() | 获取绝对路径 |
示例代码:
2|4常用方法2:创建文件,删除文件
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
方法名称 | 说明 |
---|---|
public boolean delete() | 删除文件、空文件夹 |
2|5常用方法3:遍历文件夹
方法名称 | 说明 |
---|---|
public String[] list() | 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。 |
public File[] listFiles() | 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点) |
文件的遍历中的几个注意事项:
3|0三,递归
3|11,认识递归
什么是递归?
递归是一种算法,从形式上来说,方法调用自己的形式称之为递归。
递归的形式: 有直接递归、间接递归,如下面的代码。
直接递归就是自己调用自己的方法。间接递归是自己调用别的方法,但是别的方法又调用了自己的方法。
从需求来学习:之前我们可能学过阶层,可以通过基础的java代码得到结果,那么怎样通过递归来获取呢?
可以推导是一个公式:
我们也会发现一个出口:
就是f(1) =1的时候,这个时候我们就无法在套用公式,这个就是我们的递归出口。
总结一下,递归的三个条件:
比如计算阶层的方法可以这样写:
综合案例:
从指定的文件夹找出所有符合或者包含条件的文件:并打印
__EOF__

本文链接:https://www.cnblogs.com/yfs1024/p/17185275.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现