360做的网站,网站建设及优化 赣icp,seo平台怎么样,网络管理系统软件有哪些引言
Java 8引入了许多新特性#xff0c;其中最为显著的莫过于Lambda表达式和Stream API。Stream API提供了一种高效、简洁的方法来处理集合数据#xff0c;使代码更加简洁明了#xff0c;且具有较高的可读性和可维护性。本文将深入探讨Java Stream API的使用#xff0c;包…引言
Java 8引入了许多新特性其中最为显著的莫过于Lambda表达式和Stream API。Stream API提供了一种高效、简洁的方法来处理集合数据使代码更加简洁明了且具有较高的可读性和可维护性。本文将深入探讨Java Stream API的使用包括基础概念、常用操作、并行处理、实战案例以及最佳实践等内容。
目录
什么是Stream APIStream API的基础操作 创建Stream中间操作终端操作 Stream API的高级操作 排序筛选映射规约收集 并行StreamStream API实战案例 处理集合数据文件操作数据库操作 Stream API的最佳实践常见问题与解决方案总结
什么是Stream API
Stream API是Java 8引入的一种用于处理集合数据的抽象它允许以声明性方式类似SQL语句来处理数据。Stream API提供了许多强大的操作可以用来对集合进行过滤、排序、映射、规约等操作极大地简化了代码。
特点
声明性编程使用Stream API可以以声明性的方式编写代码减少样板代码。链式调用Stream API的操作可以链式调用提高代码的可读性。惰性求值中间操作是惰性求值的只有在执行终端操作时才会进行计算。并行处理支持并行处理可以充分利用多核CPU的优势。
Stream API的基础操作
创建Stream
Stream API提供了多种方式来创建Stream常见的有以下几种
从集合创建
ListString list Arrays.asList(a, b, c);
StreamString stream list.stream();从数组创建
String[] array {a, b, c};
StreamString stream Arrays.stream(array);使用Stream.of
StreamString stream Stream.of(a, b, c);使用Stream.generate
StreamDouble stream Stream.generate(Math::random).limit(10);使用Stream.iterate
StreamInteger stream Stream.iterate(0, n - n 2).limit(10);中间操作
中间操作用于转换Stream是惰性求值的常见的中间操作有以下几种
filter用于过滤元素。
StreamString stream list.stream().filter(s - s.startsWith(a));map用于映射每个元素到对应的结果。
StreamString stream list.stream().map(String::toUpperCase);flatMap用于将每个元素转换为Stream然后合并成一个Stream。
StreamString stream list.stream().flatMap(s - Stream.of(s.split()));distinct用于去重。
StreamString stream list.stream().distinct();sorted用于排序。
StreamString stream list.stream().sorted();peek用于在处理过程中查看每个元素。
StreamString stream list.stream().peek(System.out::println);终端操作
终端操作用于启动Stream的计算并生成结果常见的终端操作有以下几种
forEach对每个元素执行操作。
list.stream().forEach(System.out::println);collect将Stream转换为其他形式。
ListString result list.stream().collect(Collectors.toList());reduce将Stream中的元素规约成一个值。
OptionalString result list.stream().reduce((s1, s2) - s1 s2);toArray将Stream转换为数组。
String[] array list.stream().toArray(String[]::new);count计算元素个数。
long count list.stream().count();anyMatch、allMatch、noneMatch用于匹配判断。
boolean anyMatch list.stream().anyMatch(s - s.startsWith(a));
boolean allMatch list.stream().allMatch(s - s.startsWith(a));
boolean noneMatch list.stream().noneMatch(s - s.startsWith(a));findFirst、findAny用于查找元素。
OptionalString first list.stream().findFirst();
OptionalString any list.stream().findAny();Stream API的高级操作
排序
使用sorted方法对Stream进行排序可以传入一个比较器。
ListString list Arrays.asList(b, c, a);
ListString sortedList list.stream().sorted().collect(Collectors.toList());
// 逆序排序
ListString sortedListDesc list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());筛选
使用filter方法对Stream中的元素进行筛选。
ListString list Arrays.asList(a, b, c);
ListString filteredList list.stream().filter(s - s.startsWith(a)).collect(Collectors.toList());映射
使用map方法对Stream中的元素进行映射。
ListString list Arrays.asList(a, b, c);
ListString mappedList list.stream().map(String::toUpperCase).collect(Collectors.toList());规约
使用reduce方法对Stream中的元素进行规约。
ListString list Arrays.asList(a, b, c);
String result list.stream().reduce(, (s1, s2) - s1 s2);收集
使用collect方法将Stream转换为其他形式。
ListString list Arrays.asList(a, b, c);
ListString collectedList list.stream().collect(Collectors.toList());
SetString collectedSet list.stream().collect(Collectors.toSet());
String joinedString list.stream().collect(Collectors.joining(,));并行Stream
并行Stream可以充分利用多核CPU的优势提高数据处理的效率。可以使用parallelStream方法创建并行Stream。
ListString list Arrays.asList(a, b, c);
ListString parallelList list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());也可以使用parallel方法将普通Stream转换为并行Stream。
ListString list Arrays.asList(a, b, c);
ListString parallelList list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());需要注意的是并行Stream并不是总是比串行Stream更快具体需要根据具体情况进行测试。
Stream API实战案例
处理集合数据
案例一过滤并转换集合
给定一个包含若干字符串的集合过滤掉长度小于3的字符串并将剩余字符串转换为大写。
ListString list Arrays.asList(a, ab, abc, abcd);
ListString result list.stream().filter(s - s.length() 3).map(String::toUpperCase).collect(Collectors.toList());
System.out.println(result); // 输出[ABC, ABCD]案例二计算平均值
给定一个包含若干整数的集合计算所有整数的平均值。
ListInteger list Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average list.stream().mapToInt(Integer::intValue).average();
average.ifPresent(System.out::println); // 输出3.0文件操作
案例三读取文件内容
使用Stream API
读取文件内容并输出到控制台。
try (StreamString lines Files.lines(Paths.get(example.txt))) {lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}案例四统计单词出现次数
读取文件内容并统计每个单词出现的次数。
try (StreamString lines Files.lines(Paths.get(example.txt))) {MapString, Long wordCount lines.flatMap(line - Arrays.stream(line.split(\\W))).collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));wordCount.forEach((word, count) - System.out.println(word : count));
} catch (IOException e) {e.printStackTrace();
}数据库操作
案例五处理数据库查询结果
假设我们有一个数据库表users包含字段id、name和age。我们可以使用Stream API处理查询结果。
ListUser users queryDatabase();
ListString names users.stream().filter(user - user.getAge() 18).map(User::getName).collect(Collectors.toList());
System.out.println(names);Stream API的最佳实践
避免不必要的并行化并行Stream并不是总是更快应该根据具体情况进行选择。合理使用中间操作和终端操作中间操作是惰性求值的只有在执行终端操作时才会进行计算。注意Stream的可复用性Stream一旦被消费就不能再使用如果需要复用可以考虑将Stream转换为集合再使用。使用合适的收集器Collectors类提供了多种收集器可以根据具体需求选择合适的收集器。处理异常在使用Stream API时需要处理可能出现的异常尤其是在文件操作和数据库操作中。
常见问题与解决方案
Stream已关闭
Stream一旦被消费就不能再使用如果需要复用可以考虑将Stream转换为集合再使用。
ListString list Arrays.asList(a, b, c);
StreamString stream list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException性能问题
并行Stream并不是总是比串行Stream更快具体需要根据具体情况进行测试。可以使用ForkJoinPool来优化并行Stream的性能。
ForkJoinPool customThreadPool new ForkJoinPool(4);
customThreadPool.submit(() -list.parallelStream().forEach(System.out::println)
).get();内存泄漏
在使用Stream API处理大数据量时需要注意内存泄漏的问题。可以使用close方法关闭Stream或者使用try-with-resources语句自动关闭Stream。
try (StreamString lines Files.lines(Paths.get(example.txt))) {lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}总结
本文详细介绍了Java Stream API的使用包括基础操作、高级操作、并行处理、实战案例以及最佳实践等内容。通过合理利用Stream API开发者可以大大简化代码提高代码的可读性和可维护性同时还可以提高数据处理的效率。希望本文对你在Java开发中的Stream API使用有所帮助。
Java Stream API是处理集合数据的强大工具通过灵活运用各种操作可以实现高效的数据处理和流式计算。如果你还没有使用过Stream API建议尽快学习和掌握这一强大的工具将其应用到你的项目中提升开发效率和代码质量。