java8新特性 stream流的方式遍历集合和数组操作

yizhihongxing

Java 8引入了Stream API,Stream是一种数据处理流程,可以进行筛选、排序、聚合等操作。相比于旧的集合遍历方式,Stream使得代码更加简洁、灵活并且易于并行处理大数据量。

1. Stream简介

1.1 什么是Stream

Stream是Java 8引入的一个新API,它允许我们以声明式的方式遍历集合、数组等数据源,把复杂的操作串起来,形成一条流水线。Stream本质上是一个从数据源生成的元素序列,其主要作用是对集合/数组进行聚合操作。

1.2 使用Stream的好处

Stream的好处主要有以下几点:

  • 声明式编程风格,代码更加简洁易懂。
  • 支持并行处理,可以充分利用多核CPU的优势,处理大规模数据集合。
  • 内置大量函数式接口,可以避免一些基本逻辑的重复实现。

1.3 与集合的关系

在Java 8之前,我们对集合进行操作时,通常会使用迭代器或者foreach语句。这种方式虽然简单易懂,但是需要人工控制循环变量,代码可读性不高。

Java 8引入了Stream API,使得我们可以以一种更加简洁、优雅的方式对集合进行操作。Stream提供了一些常用的操作方法,如filter、map、reduce等,可以实现从集合中筛选、转换、统计等常见操作。同时,Stream也支持并行处理,可以提高大数据集合处理的效率。

2. Stream基本用法

2.1 生成Stream

生成一个Stream需要以下步骤:

  • 获取一个数据源,如集合、数组等。
  • 创建一个Stream对象,可以通过Stream的静态工厂方法来创建。

Stream的两种来源如下:

2.1.1 通过Collection生成

List<String> list = Arrays.asList("java", "python", "C");
Stream<String> stream = list.stream();

2.1.2 通过Array生成

String[] array = new String[]{"java", "python", "C"};
Stream<String> stream = Arrays.stream(array);

2.2 Stream的操作

Stream有两种操作类型:中间操作和终止操作。中间操作是返回Stream对象本身的操作,可以连续调用多个中间操作,直到终止操作被调用。终止操作是返回其他类型的操作,会终结Stream的遍历,并返回结果。

下面我们来一一介绍Stream的几种操作。

2.2.1 筛选操作

  • filter:对Stream中的元素进行过滤,返回一个由符合条件的元素组成的Stream。
List<String> list = Arrays.asList("java", "python", "C");
list.stream().filter(s -> s.startsWith("j")).forEach(System.out::println);

输出结果:

java
  • distinct:通过Stream中元素的equals和hashCode方法去除重复元素。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 2);
list.stream().distinct().forEach(System.out::println);

输出结果:

1
2
3

2.2.2 转换操作

  • map:将一个Stream中的每个元素都应用一个函数,返回一个由结果组成的新Stream。
List<String> list = Arrays.asList("hello", "world", "java");
list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);

输出结果:

HELLO
WORLD
JAVA

2.2.3 统计操作

  • count:返回Stream中元素的个数。
List<String> list = Arrays.asList("hello", "world", "java");
long count = list.stream().count();
System.out.println(count);

输出结果:

3

2.2.4 终止操作

  • forEach:遍历Stream中的每个元素,对每个元素执行指定操作。
List<String> list = Arrays.asList("hello", "world", "java");
list.stream().forEach(System.out::println);

输出结果:

hello
world
java
  • collect:将Stream中的元素转换为其他集合类型,如List、Set、Map等。
List<String> list = Arrays.asList("hello", "world", "java");
List<String> newList = list.stream().filter(s -> s.startsWith("h")).collect(Collectors.toList());
System.out.println(newList);

输出结果:

[hello]

2.3 并行处理

Stream可以方便地以并行方式处理数据,提高处理效率。可以通过parallelStream方法来获得一个并行版的Stream对象。

List<String> list = Arrays.asList("hello", "world", "java");
list.parallelStream().forEach(System.out::println);

输出结果:

world
java
hello

3. 示例

下面我们来实现两个具体的示例,对比一下使用Stream和传统方式的差异。

3.1 集合求和

假设有一个整型List,我们想求其所有元素之和。使用传统方式,我们需要使用循环变量遍历集合中的每个元素,然后求和。代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int i : list) {
    sum += i;
}
System.out.println(sum);

使用Stream,我们可以通过一条语句实现该功能:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);

其中,mapToInt方法是将Integer对象转换成int类型,sum方法是对所有int类型的数值求和。

3.2 集合去重复

假如有一个String型的List,需要去除其中重复的元素。使用传统方式,我们需要使用Set来过滤掉重复元素,代码如下:

List<String> list = Arrays.asList("java", "python", "C", "C", "java");
Set<String> set = new HashSet<>(list);
for (String s : set) {
    System.out.println(s);
}

使用Stream,我们可以通过一条语句实现该功能:

List<String> list = Arrays.asList("java", "python", "C", "C", "java");
list.stream().distinct().forEach(System.out::println);

其中,distinct方法会去除重复元素,forEach方法实现遍历输出。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java8新特性 stream流的方式遍历集合和数组操作 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringMvc返回modelandview返回的页面无法跳转问题及解决

    当使用Spring MVC中的ModelAndView返回页面时,有时页面无法正常跳转,这种问题通常是由于Spring MVC配置不正确导致的。下面是解决此类问题的完整攻略: 1. 确认控制器方法返回类型和视图名称 在控制器方法中,应该返回一个ModelAndView类型的对象,在这个对象中设置好要跳转的视图名称和需要传递给视图的模型数据。 示例如下: @R…

    Java 2023年6月15日
    00
  • Springboot集成ProtoBuf的实例

    下面是Spring Boot集成ProtoBuf的实例攻略,包括以下几个步骤: 添加依赖 在pom.xml文件中添加protobuf的依赖 <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</arti…

    Java 2023年5月26日
    00
  • SpringData JPA的常用语法汇总

    下面我将为你详细讲解SpringData JPA的常用语法汇总。 1.概述 SpringData JPA是Spring框架的一个子项目,它提供了一种非常方便的方式来简化JPA的使用,降低了编写JPA代码的复杂度。SpringData JPA主要是基于JPA规范来实现的,并对JPA规范进行了一些扩展,提供了一些更为方便的API和方法。 2.常用语法汇总 2.1…

    Java 2023年5月20日
    00
  • JDK8到JDK17有哪些吸引人的新特性?

    作者:京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理。任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上。但是需要一个组织审核来确保构建的发行版是有效的, 这个组织就是JCP(Java Community Process)。2009年,SUN公司被Oracle公司”白嫖”(参考2…

    Java 2023年4月18日
    00
  • Java实现的KNN算法示例

    下面是Java实现KNN算法的完整攻略: 什么是KNN算法? KNN(K-Nearest Neighbors)算法是一种经典的机器学习算法,属于分类算法。该算法基于样本之间的距离(通常用欧式距离),将测试样本与训练样本进行相似度比较,选取距离最近的K个训练样本,通过少数服从多数的投票方式,确定测试样本的类别。 KNN算法可以用于分类和回归问题,本文仅介绍分类…

    Java 2023年5月18日
    00
  • JSP中param标签用法实例分析

    即将为您讲解JSP中param标签的用法。 什么是param标签 param标签是JSP中一个自定义标签,用于向一个JSP标记库动态传递参数。该标签必须被包含在定义了该库的标记文件中,以便在库的使用者中提供一些参数化的功能。 param标签的使用方法 下面是param标签的通用语法: <jsp:param [name="parameter_n…

    Java 2023年6月15日
    00
  • JAVA内存模型(JMM)详解

    JAVA内存模型(JMM)详解 什么是JMM JMM 是 Java Memory Model 的缩写,即 Java 内存模型,是一种制定了共享内存系统中多线程访问规则的抽象规范。它规定了 JVM 中各个线程之间的共享变量存储在主内存中,每个线程都有自己的工作内存和虚拟机栈,变量值的更改仅在工作内存中进行,需要同步到主内存中才能被其他线程看到。 JMM 可以保…

    Java 2023年5月26日
    00
  • Maven中dependency和plugins的继承与约束

    Maven 中的 dependency 和 plugins 的继承和约束机制是 Maven 中非常重要的一部分,它能够让开发者更加方便地管理项目的依赖和构建过程。在 Maven 中,我们可以通过使用 dependencyManagement 和 pluginManagement 元素来实现依赖和插件的继承和约束。 一、dependency 的继承与约束 继承…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部