制作伪装网站,自助服务系统网站,网站建设服务费进入什么科目,平面设计培训多少钱 贵吗Java的Stream流#xff1a;文件处理、排序与串并行流的全面指南
Java 8 引入了 Stream API#xff0c;这是一个用于处理集合数据的强大工具#xff0c;它提供了一种声明式的方式来进行聚合操作。Stream 不是一个数据结构#xff0c;而是一种对数据进行操作的抽象#xff…Java的Stream流文件处理、排序与串并行流的全面指南
Java 8 引入了 Stream API这是一个用于处理集合数据的强大工具它提供了一种声明式的方式来进行聚合操作。Stream 不是一个数据结构而是一种对数据进行操作的抽象允许开发者以一种更简洁、易读的方式来表达复杂的查询逻辑。下面我们将详细介绍 Java Stream 的概念、特性以及如何使用它。
1 Stream 的基本概念
Stream 是一个来自源的数据元素序列支持顺序和并行聚合操作。它可以看作是高级版本的 Iterator但是与 Iterator 不同的是Stream 操作可以链式调用从而形成一系列的操作流水线。此外Stream 的操作不会修改源数据而是生成新的结果。
1.2 Stream 的创建
创建 Stream 有多种方式
从集合创建大多数集合类都提供了 stream() 和 parallelStream() 方法来创建串行流或并行流。通过静态方法创建Stream.of() 可以接受不定数量的参数来创建流Stream.generate() 和 Stream.iterate() 可以生成无限流通常需要结合 limit() 来限制大小。从数组创建可以通过 Arrays.stream(array) 或者直接调用数组上的 stream() 方法来创建流。文件读取BufferedReader.lines() 可以将文件的每一行转换成流中的元素。正则表达式分割字符串Pattern.splitAsStream() 可以根据指定的分隔符将字符串拆分成流。
1.3 中间操作
中间操作是指那些返回另一个 Stream 的操作它们本身不会触发任何计算只有当终端操作被执行时才会真正开始处理数据。常见的中间操作包括
filter过滤掉不符合条件的元素。map对每个元素应用一个函数并返回一个新的 Stream。flatMap对每个元素应用一个函数该函数返回一个 Stream然后将所有这些 Stream 扁平化为一个单独的 Stream。distinct去除重复元素。sorted对元素排序可以选择自然排序或自定义比较器。peek对每个元素执行副作用操作如打印但不改变流的内容。
1.4 终端操作
一旦执行了终端操作Stream 就会被消耗掉不能再被使用。常见的终端操作有
forEach遍历流中的每一个元素。collect将流中的元素收集到集合中如 List 或 Set。reduce通过某种方式减少流中的元素例如求和或乘积。count统计流中元素的数量。min/max找到最小值/最大值。anyMatch/allMatch/noneMatch检查是否至少有一个/所有/没有元素满足给定的谓词。
2 基本使用示例
示例1 筛选大于等于 10 的整数
ListInteger numbers Arrays.asList(5, 10, 15, 20, 25, 30);
numbers.stream().filter(num - num 10).forEach(System.out::println);这段代码会输出 10, 15, 20, 25, 30因为这些都是大于等于 10 的数字。
示例2 提取员工姓名
ListEmployee employees Arrays.asList(new Employee(Alice, 25),new Employee(Bob, 30),new Employee(Charlie, 35)
);
employees.stream().map(Employee::getName).forEach(System.out::println);这里我们使用 map 操作提取了每个员工的名字并打印出来。
示例3 去重
ListInteger numbers Arrays.asList(1, 2, 3, 4, 2, 3, 5, 1, 6);
numbers.stream().distinct().forEach(System.out::println);这段代码会输出 1, 2, 3, 4, 5, 6因为 distinct 操作已经移除了重复的元素。
3 文件读取与 Stream 结合
在 Java 8 中Files.lines() 方法提供了一种简单而有效的方式来逐行读取文件内容并将其转换为 Stream。这使得我们可以利用 Stream 的强大功能来处理文件中的每一行数据例如过滤、映射、排序等。下面我们将通过几个具体的示例来展示如何结合文件读取操作使用 Stream。
示例 4逐行读取文件并打印
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;public class 读取文件示例 {public static void main(String[] args) {try (StreamString 行流 Files.lines(Paths.get(data.txt))) {行流.forEach(System.out::println);} catch (IOException e) {System.err.println(读取文件时发生错误: e.getMessage());}}
}这段代码展示了如何使用 Files.lines() 方法逐行读取文件 data.txt 并打印每一行的内容。try-with-resources 语句确保了流在使用完毕后会被自动关闭避免资源泄露。
示例 5查找包含特定关键词的行
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;public class 查找关键词示例 {public static void main(String[] args) {try (StreamString 行流 Files.lines(Paths.get(data.txt))) {OptionalString 包含密码的行 行流.filter(行 - 行.contains(密码)).findFirst();if (包含密码的行.isPresent()) {System.out.println(找到包含 密码 的行: 包含密码的行.get());} else {System.out.println(没有行包含 密码.);}} catch (IOException e) {System.err.println(读取文件时发生错误: e.getMessage());}}
}此示例展示了如何使用 filter 和 findFirst 方法来查找文件中包含特定关键词如 “密码”的第一行并将其打印出来。如果找不到符合条件的行则输出相应的提示信息。
示例 6统计文件中单词的数量
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Pattern;
import java.util.stream.Collectors;public class 统计单词数量示例 {public static void main(String[] args) throws IOException {long 单词总数 Files.lines(Paths.get(data.txt)).flatMap(Pattern.compile(\\s)::splitAsStream).count();System.out.println(总共有 单词总数 个单词);}
}在这个例子中我们使用 flatMap 方法结合正则表达式来分割每一行文本从而得到一个包含所有单词的流。然后我们使用 count 方法统计总共有多少个单词。这种方法非常适合处理大文件因为它可以在不加载整个文件到内存的情况下完成任务。
示例 7按字母顺序排序并去重后的单词列表
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;public class 排序去重单词示例 {public static void main(String[] args) throws IOException {ListString 排序后的唯一单词 Files.lines(Paths.get(data.txt)).flatMap(Pattern.compile(\\s)::splitAsStream).distinct().sorted().collect(Collectors.toList());System.out.println(按字母顺序排序并去重后的单词: 排序后的唯一单词);}
}这段代码展示了如何结合 flatMap、distinct 和 sorted 方法来获取文件中按字母顺序排序且去重后的单词列表。最终结果被收集到一个 ListString 中并打印出来。这种方法可以有效地去除重复项并对结果进行排序非常适合用于文本分析等场景。
5 串行流与并行流
串行流是指所有操作都在单个线程上依次执行而并行流则是指操作可以在多个线程上并发执行。并行流可以在多核处理器上提高效率但是需要注意并不是所有的操作都适合并行化而且并行流可能会带来额外的开销。因此在选择使用串行流还是并行流时应该根据具体的应用场景做出权衡。
示例 8使用串行流计算文件中单词的总长度
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Pattern;public class 串行流计算单词总长度示例 {public static void main(String[] args) throws IOException {long 单词总长度 Files.lines(Paths.get(data.txt)).flatMap(Pattern.compile(\\s)::splitAsStream).mapToInt(String::length).sum();System.out.println(所有单词的总长度: 单词总长度);}
}这段代码展示了如何使用串行流来计算文件中所有单词的总长度。flatMap 方法将每一行文本拆分为多个单词mapToInt 方法将每个单词映射为其长度最后使用 sum 方法计算所有单词长度的总和。
示例 9使用并行流计算文件中单词的总长度
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Pattern;public class 并行流计算单词总长度示例 {public static void main(String[] args) throws IOException {long 单词总长度 Files.lines(Paths.get(data.txt)).parallel() // 使用并行流.flatMap(Pattern.compile(\\s)::splitAsStream).mapToInt(String::length).sum();System.out.println(所有单词的总长度: 单词总长度);}
}在这段代码中我们通过调用 parallel() 方法将串行流转换为并行流从而允许 JVM 在多核处理器上并行处理文件中的每一行。需要注意的是并行流的使用可能会导致结果的顺序发生变化但在本例中由于我们只关心单词长度的总和因此顺序不影响最终结果。
6 性能考量
虽然 Stream 提供了非常方便的操作接口但在某些情况下可能会影响性能特别是对于大规模数据集。并行流可以在多核处理器上提高效率但是需要注意并不是所有的操作都适合并行化而且并行流可能会带来额外的开销。因此在选择使用串行流还是并行流时应该根据具体的应用场景做出权衡。
7 使用 Stream 的注意事项
惰性求值Stream 的中间操作是惰性的只有遇到终端操作时才会触发实际的计算。 不可重用Stream 的一旦被消费即执行了终端操作便不能再次使用。如果需要多次操作同一组数据可以创建多个流对象。 线程安全虽然并行流可以在多线程环境中工作但这并不意味着它是线程安全的。对于非线程安全的操作仍然需要采取适当的同步措施。
总结
通过上述示例我们可以看到 Java Stream API 提供了一种简洁且强大的方式来处理集合数据。无论是文件读取、简单排序还是串行流与并行流的选择Stream 都能够帮助开发者写出更加优雅和高效的代码。然而在实际开发中我们应该根据具体的需求和数据量来决定是否使用 Stream以及选择合适的流类型以确保最佳的性能和可维护性。 文章转载自: http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn http://www.morning.rfdqr.cn.gov.cn.rfdqr.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.pzwfw.cn.gov.cn.pzwfw.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.mlntx.cn.gov.cn.mlntx.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.tfzjl.cn.gov.cn.tfzjl.cn http://www.morning.jjzbx.cn.gov.cn.jjzbx.cn http://www.morning.yhywr.cn.gov.cn.yhywr.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.zrpbf.cn.gov.cn.zrpbf.cn http://www.morning.jopebe.cn.gov.cn.jopebe.cn http://www.morning.kntbk.cn.gov.cn.kntbk.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.bpmnx.cn.gov.cn.bpmnx.cn http://www.morning.wbysj.cn.gov.cn.wbysj.cn http://www.morning.yrbq.cn.gov.cn.yrbq.cn http://www.morning.sxygc.cn.gov.cn.sxygc.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn http://www.morning.tgfsr.cn.gov.cn.tgfsr.cn http://www.morning.mfxcg.cn.gov.cn.mfxcg.cn http://www.morning.qnbgh.cn.gov.cn.qnbgh.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.lsnbx.cn.gov.cn.lsnbx.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.ssfq.cn.gov.cn.ssfq.cn http://www.morning.rqrxh.cn.gov.cn.rqrxh.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.pbmg.cn.gov.cn.pbmg.cn http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.stbhn.cn.gov.cn.stbhn.cn http://www.morning.cywf.cn.gov.cn.cywf.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.plqqp.cn.gov.cn.plqqp.cn http://www.morning.knmby.cn.gov.cn.knmby.cn http://www.morning.glrzr.cn.gov.cn.glrzr.cn http://www.morning.tnbas.com.gov.cn.tnbas.com http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.jhzct.cn.gov.cn.jhzct.cn http://www.morning.dbjyb.cn.gov.cn.dbjyb.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.fnmtc.cn.gov.cn.fnmtc.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.qggcc.cn.gov.cn.qggcc.cn http://www.morning.jwqqd.cn.gov.cn.jwqqd.cn http://www.morning.qnbzs.cn.gov.cn.qnbzs.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.tzjqm.cn.gov.cn.tzjqm.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.gyfwy.cn.gov.cn.gyfwy.cn http://www.morning.lznfl.cn.gov.cn.lznfl.cn http://www.morning.rmryl.cn.gov.cn.rmryl.cn http://www.morning.qrmry.cn.gov.cn.qrmry.cn http://www.morning.hjwxm.cn.gov.cn.hjwxm.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.dnydy.cn.gov.cn.dnydy.cn http://www.morning.jmnfh.cn.gov.cn.jmnfh.cn http://www.morning.hrkth.cn.gov.cn.hrkth.cn http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.yfrlk.cn.gov.cn.yfrlk.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.fqsxf.cn.gov.cn.fqsxf.cn