`
cakin24
  • 浏览: 1373161 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java 8新增的Stream操作

    博客分类:
  • java
阅读更多

一 Stream流概述
1 Java 8还新增了Stream、IntStream、LongStream、DoubleStream等流式API。
2 独立使用Stream的步骤如下:
(1)使用Stream或XxxStream的builder()类方法创建该Stream对应Builder。
(2)重复调用Builder的add()方法向该流中添加多个元素。
(3)调用Builder的build()方法获取对应的Stream。
(4)调用Stream的聚集方法。
3 Collection接口提供了一个stream()默认方法,该方法可返回该集合对应的流,接下来即可通过流API来操作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Stream极大了丰富了集合的功能。

 

二 Stream的中间方法和末端方法的应用

1 代码示例

import java.util.stream.*;

public class IntStreamTest
{
	public static void main(String[] args)
	{
		IntStream is = IntStream.builder()
			.add(20)
			.add(13)
			.add(-2)
			.add(18)
			.build();
		// 下面调用聚集方法的代码每次只能执行一个
		//System.out.println("is所有元素的最大值:" + is.max().getAsInt());		//输出20
		//System.out.println("is所有元素的最小值:" + is.min().getAsInt());		//输出-2
		//System.out.println("is所有元素的总和:" + is.sum());					//输出49
		//System.out.println("is所有元素的总数:" + is.count());					//输出4
		//System.out.println("is所有元素的平均值:" + is.average());				//输出 OptionalDouble[12.25]
		//System.out.println("is所有元素的平方是否都大于20:"
		//	+ is.allMatch(ele -> ele * ele > 20));								//输出false
		//System.out.println("is是否包含任何元素的平方大于20:"
		//	+ is.anyMatch(ele -> ele * ele > 20));								//输出true
		// 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1
		IntStream newIs = is.map(ele -> ele * 2 + 1);
		// 使用方法引用的方式来遍历集合元素
		newIs.forEach(System.out::println); // 输出41 27 -3 37
	}
}

 

2 运行结果

41
27
-3
37

 

3 代码分析

上面代码先创建了一个IntStream,接下来分别多次调用IntStream的聚集方法执行操作,这样即可获取该流的相关信息。
Stream流提供了大量的方法进行聚集操作,这些方法既可以是“中间的”,也可以是“末端的”。
中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的map()方法就是中间方法。中间方法的返回值是另外一个流。
末端方法:末端方法是对流的最终操作。当对某个Stream执行末端方法后,该流就会被“消耗”且不可再用。上面程序的sum()。count()、average()等方法都是末端方法。

 

三 Stream的filter方法的应用

1 代码示例

import java.util.*;
import java.util.function.*;

public class CollectionStream
{
	public static void main(String[] args)
	{
		// 创建books集合、为books集合添加元素的代码与8.2.5小节的程序相同。
		Collection books = new HashSet();
		books.add(new String("轻量级Java EE企业应用实战"));
		books.add(new String("疯狂Java讲义"));
		books.add(new String("疯狂iOS讲义"));
		books.add(new String("疯狂Ajax讲义"));
		books.add(new String("疯狂Android讲义"));
		// 统计书名包含“疯狂”子串的图书数量
		System.out.println(books.stream()
			.filter(ele->((String)ele).contains("疯狂"))
			.count()); // 输出4
		// 统计书名包含“Java”子串的图书数量
		System.out.println(books.stream()
			.filter(ele->((String)ele).contains("Java") )
			.count()); // 输出2
		// 统计书名字符串长度大于10的图书数量
		System.out.println(books.stream()
			.filter(ele->((String)ele).length() > 10)
			.count()); // 输出2
		// 先调用Collection对象的stream()方法将集合转换为Stream,
		// 再调用Stream的mapToInt()方法获取原有的Stream对应的IntStream
		books.stream().mapToInt(ele -> ((String)ele).length())
			// 调用forEach()方法遍历IntStream中每个元素
			.forEach(System.out::println);// 输出8  11  16  7  8
	}
}

 

2 运行结果

4
2
2
8
11
16
7
8

 

3 代码分析

代码只要调用Collection的stream()方法即可返回该集合对应的Stream,接下来调用Stream提供的方法对所有集合中的元素进行处理,这样可以大大简化集合编程的代码,这也是Stream编程带来的优势。
代码最后一句先调用Collection对象的stream()方法将集合转换为Stream对象,然后调用Stream对象的mapToint()方法将其转换为IntStream,这个mapToInt()方法就是一个中间方法,因此程序可继续调用IntStream的forEach()方法来遍历流中的元素。

0
0
分享到:
评论
1 楼 zhp8341 2016-09-06  
http://www.ccblog.cn/85.htm 附上jdk8lambda基本原理及性能分析

相关推荐

    Java8 Stream学习

    在Java8中,Stream 是一项重要的新增特性,它提供了一种全新的处理集合数据的方式。不同于传统的集合类(如List、Set等),Stream API支持更加灵活的数据处理方式,使得开发人员能够以声明式的方式来处理数据。 **...

    Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合.md

    Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda,给我们操作集合(Collection)提供了极大的便利。 Stream将要处理的元素集合看作一种流,在流的过程中,借助`Stream API`对流中的...

    探索Java 8的Stream API:数据流处理的新纪元

    Stream API是Java 8引入的一项重要特性,它将数据集合视为一种可以被操作的数据流。通过一系列的中间操作和终端操作,可以高效地处理数据集合。 - **Stream**:表示一组元素的序列,这些元素可以通过各种操作被聚合...

    java8中文文档API

    Java 8内置了Nashorn JavaScript引擎,使得Java可以直接执行JavaScript代码,促进了Java与JavaScript之间的互操作性。 **9. 类型接口的实例推断** Java 8允许编译器自动推断类型接口实例的类型,例如在`Function....

    《Java 8 in Action》是一本关于 Java 编程语言的书籍,重点介绍了 Java 8 中引入的新特性和改进

    Stream API: 介绍 Java 8 中引入的 Stream API,以及如何使用 Stream API 来处理集合数据和进行流式操作。 新的日期和时间 API: 探讨 Java 8 中新增的日期和时间 API,以及如何使用这些 API 来处理日期、时间和...

    java8 API 文档

    除了顺序流,Java 8还引入了并行流,它可以在多核处理器上并行执行流操作,提高性能。例如,`list.parallelStream().forEach(System.out::println);` 10. **类型接口的实例推断** Java 8改进了类型推断机制,允许...

    JAVA8的新增特性

    Java 8是Java编程语言的一个重大更新,引入了许多新特性,极...以上就是Java 8的主要新增特性,它们极大地丰富了Java的语法和功能,使得Java在保持其强大的企业级应用开发能力的同时,也具备了更多现代编程范式的支持。

    Java8 官方教程

    3. **Stream API**:Stream API是Java8的核心特性之一,它提供了一种对集合数据进行操作的新方式。通过链式调用如filter(), map(), reduce()等方法,可以实现高效的并行处理和聚合操作。 4. **默认方法**:在接口中...

    JAVA8API-官方文档下载-中文版

    5. **日期和时间API**: Java 8引入了`java.time`包,提供`LocalDate`、`LocalTime`、`LocalDateTime`等类,替代了原有的`java.util.Date`和`Calendar`,使日期和时间的操作更加直观。 **模块系统(Project Jigsaw)...

    java8stream源码-Streams:JavaStream概览

    Stream API 是 Java 8 中的新增功能,它提供了一种处理数据的新方法,特别是对于集合数据结构。Stream 不是集合,而是用于处理集合的工具,它可以进行过滤、映射、分组等操作,支持并行和串行执行。Stream 操作可以...

    Java8 API.rar_JAVA8API_Java 8_java 8 api_java 8 api下载_java8

    在反射API中,Java 8新增了MethodHandle和MethodHandles类,这些类提供了更灵活、更高效的动态类型操作方式,特别是在需要高性能和低级别的元数据访问时。 总的来说,Java 8 API文档包含了关于以上所有特性的详细...

    Java 8编程入门官方教程

    根据提供的文件信息,我们可以从标题、描述以及部分给出的内容中提炼出关于“Java 8编程入门官方教程”的关键知识点。 ### Java 8编程入门官方教程 #### 一、概述 《Java 8编程入门官方教程》是一本由美国作者...

    Pro Java 8 Programming

    3. **Stream API**:这是Java 8中最显著的改变之一,提供了一种处理集合的新方式,支持串行和并行数据流操作。例如,map、filter、reduce和collect等方法使数据处理更加高效且易读。 4. **方法引用和构造器引用**:...

    java8,JDK,JDK8,Android

    对于Android开发者,虽然Java 8的全部特性并不完全支持,但随着时间的推移,很多关键特性,如Lambda表达式、Stream API和日期时间API,已经被引入到Android Studio中,可以显著提升Android应用的开发效率和质量。...

    OnJava8.zip

    Stream API是Java 8中的一大亮点,它提供了一种新的数据处理方式,允许对集合进行声明式操作。Stream API支持串行和并行操作,可以方便地进行过滤、映射、归约等操作。例如,我们可以使用`stream().filter().map()....

    Java 8 源码

    2. Stream API:Stream API是Java 8的另一大亮点,提供了一种对集合数据进行操作的新方式。Stream API支持链式操作,如filter、map、reduce等,可以进行高效的并行计算。通过Stream API,开发者可以写出更加简洁、易...

    java8新特性-最新

    Stream API是Java 8中的另一个核心特性,它提供了一种新的数据处理方式,将集合数据转化为一系列可操作的流水线。Stream API支持串行和并行操作,非常适合进行大数据处理和并行计算。通过Stream API,开发者可以方便...

    java8参考手册

    - **Stream API**:Stream API允许对集合进行声明式、函数式的操作,例如过滤、映射、减少等。它支持串行和并行处理,极大提高了数据处理的能力。 2. **日期与时间API**: - **java.time**包:Java 8引入了全新的...

    java 8 api

    `Optional<T>`类是Java 8新增的容器类,用于解决null值检查的繁琐和潜在的空指针异常。`Optional`对象可以包含或不包含非null值,通过`isPresent()`判断是否存在值,`get()`获取值,而`orElse()`提供默认值,这样...

Global site tag (gtag.js) - Google Analytics