域名过户后怎么做网站,首页设计说明,百度竞价代理商,网络互动公司排名Java 8引入了一种新的抽象概念——流#xff08;Stream#xff09;#xff0c;它允许我们以声明式方式处理数据集合。通过使用流#xff0c;可以更简洁、更易读地编写代码来对集合进行复杂的操作#xff0c;如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使…Java 8引入了一种新的抽象概念——流Stream它允许我们以声明式方式处理数据集合。通过使用流可以更简洁、更易读地编写代码来对集合进行复杂的操作如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使用方法。 创建流
要使用流首先需要创建一个流。流可以从多种数据源创建如数组、集合、文件等。以下是一些创建流的示例
// 从数组创建流
int[] numbers {1, 2, 3, 4, 5};
IntStream intStream Arrays.stream(numbers);// 从集合创建流
ListString names Arrays.asList(张三, 李四, 王五);
StreamString nameStream names.stream();// 从文件创建流
try (StreamString lines Files.lines(Paths.get(example.txt))) {lines.forEach(line - {/*TODO:逐行处理文件内容*/ });
} catch (IOException e) {e.printStackTrace();
} 中间操作
中间操作是对流中的元素进行某种处理的操作例如过滤、映射、排序等。中间操作不会改变流本身而是返回一个新的流因此可以通过链式调用方法组合多个中间操作。以下是一些常见的中间操作
// 过滤元素
IntStream evenNumbers intStream.filter(n - n % 2 0);// 转换元素
StreamInteger evenNumbers1 evenNumbers.mapToObj(Integer::new);// 映射元素
StreamString upperCaseNames nameStream.map(String::toUpperCase);// 排序元素
StreamString sortedNames nameStream.sorted();
StreamString revSortedNames names.stream().sorted(Comparator.reverseOrder()); 终端操作
终端操作是对流进行最终处理的操作例如计算结果、遍历元素等。终端操作会消耗流即执行后流将不再可用。以下是一些常见的终端操作
// 计算结果如求和、平均值等
// 注意实际使用时一个流只能使用一次再次使用需要重新生成流否则会收到下列异常
// java.lang.IllegalStateException: stream has already been operated upon or closed
double average intStream.average().orElse(0);
int sum intStream.sum();
long count intStream.count();
OptionalInt max intStream.max();
OptionalInt min intStream.min();// 遍历输出每个元素
intStream.forEach(System.out::println);// 收集到列表中
ListInteger numbersList intStream.collect(Collectors.toList()); 并行流
Java 8还提供了并行流Parallel Stream它可以充分利用多核处理器的优势提高处理速度。要创建一个并行流只需在创建流时调用parallel()方法或者使用parallelStream()创建流即可
// 创建一个并行流
IntStream parallelIntStream intStream.parallel();
Arrays.asList(张三, 李四, 王五).parallelStream();
需要注意的是并非所有情况下都适合使用并行流。在某些情况下由于线程切换的开销并行流的性能可能不如串行流。因此在使用并行流时需要根据具体情况进行权衡。 示例产品分组
使用流可以方便地处理数据如过滤列表中库存大于0的产品然后按产品类型进行分组。以下为简单的代码示例其中省去了代码运行非必需的getter()和toString()方法
public static void main(String[] args) {ListProduct list new ArrayList(){{add(new Product(1, 1, 0, prod1));add(new Product(2, 1, 5, prod2));add(new Product(3, 2, 10, prod3));add(new Product(4, 2, 11, prod4));add(new Product(5, 2, 0, prod5));}};MapInteger, ListProduct map list.parallelStream() // 创建并行流.filter(product - product.getInventory() 0) // 过滤库存大于0的产品.collect(Collectors.groupingBy(Product::getProductType)); //分组后收集到Map中System.out.println(map);
}public static class Product {int productId;int productType;int inventory;String productName;public int getProductType() {return productType;}public int getInventory() {return inventory;}public Product(int productId, int productType, int inventory, String productName) {this.productId productId;this.productType productType;this.inventory inventory;this.productName productName;}
} 总结
Java 8的流操作带来了数据处理的革命性突破让开发者能够更方便、更简洁地处理数据。通过链式调用方法开发者能够清晰地表达数据处理逻辑提高代码的可读性和可维护性。同时流操作还提供了高性能、类型安全和可扩展性等优势使得开发者能够根据实际需求灵活地处理数据。