Java Streams - Java Stream Operation
外部迭代 External Iteration
操作Java集合时,我们使用外部迭代。
在外部迭代中,我们使用for或foreach循环,或获取集合的迭代器,处理一个序列的集合元素。
When operating with Java Collections we use external iteration.
In external iteration we use a for or for each loop or obtain an iterator for a collection and process elements of the collections in a sequence.
The following code computes the sum of squares of all odd integers in the list.
It uses for each loop to access every single element in the list then uses if statement to filter odd integers.
After that it calculates the square and finally stores the sum of square with sum variable.
import java.util.Arrays;
import java.util.List;
/*from www . j a va 2 s . c o m*/
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int n : numbers) {
if (n % 2 == 1) {
int square = n * n;
sum = sum + square;
}
}
System.out.println(sum);
}
}
The code above generates the following result.
35
内部迭代 Internal Iteration
We can rewrite the code above using stream. It does exactly the same.
import java.util.Arrays;
import java.util.List;
// w ww . java 2 s .c o m
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
}
}
在上面的代码中,我们没有使用循环语句来遍历列表。我们用流做内部循环。
对于奇数计算,我们使用lambda表达式。我们首先做了过滤器,然后映射,然后简化。
In the code above we didn't use loop statement to iterate through the List. We did the loop internally by stream.
For the odd integer calculation we used lambda expression. We first did the filter then map then reduce.
The code above generates the following result.
35
连续 Sequential
The external iteration typically means sequential code. The sequential code can be executed only by one thread.
流被设计用于并行处理元素。
Streams are designed to process elements in parallel.
The following code computes the sum of squares of odd integers in the list in parallel.
import java.util.Arrays;
import java.util.List;
// www . ja v a2 s . c om
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
}
}
What we did is just to replace
stream() with
parallelStream().
Parallel computation is easy when using the internal iteration provided by the stream.
The code above generates the following result.
35
命令式对比函数式 Imperative vs. Functional
在声明式编程中,我们只需要说明做什么,以及系统本身如何处理其组成部分。
集合支持命令式编程,而流支持声明式编程。
流API通过使用lambda表达式而支持函数式编程。
我们所希望的对流元素执行的操作,通常通过传递一个lambda表达式来完成。
流操作产生结果,而无需修改该数据源。
In imperative programming we control not only what to do but also how to do it.
For example, when using imperative programming to sum integers in a list. We have to decide how to iterate each element in the list. We can use for loop, for-each loop, or we can get an Iterator object from list and use while loop. Then we also have to do the sum.
In declarative programming we just need to tell what to do, the how part is handled by the system itself.
Collections support imperative programming whereas streams support declarative programming.
The Streams API supports the functional programming by using lambda expression.
What operations we want to perform on the stream elements are done typically by passing a lambda expressions.
Operations on a stream produce a result without modifying the data source.
中间操作 和 终端操作
流支持两种类型的操作:
中间操作也称为懒操作。
终端操作也称为急操作。
懒操作不处理元素,直到在流上被调用急操作。
一个流上的中间操作产生另一个流。
流把不同操作链接起来形成流管道。
在下面的代码中filter()和map()都是懒操作。而reduce()是急操作。
Intermediate operations Terminal operations
A stream supports two types of operations:
- Intermediate operations
- Terminal operations
Intermediate operations are also called lazy operations.
Terminal operations are also called eager operations.
A lazy operation does not process the elements until an eager operation is called on the stream.
An intermediate operation on a stream produces another stream.
Streams link operations to create a stream pipeline.
In the following code filter() and map() are all lazy operations. While reduce() is eager operation.
import java.util.Arrays;
import java.util.List;
// ww w . j a v a 2 s . c om
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
}
}
The code above generates the following result.
35
来源: http://www.java2s.com/Tutorials/Java/Java_Stream/0020__Java_Stream_Operation.htm
分享到:
相关推荐
7. **设备交互**: JavaCV支持与摄像头、视频文件以及网络流的交互,可以实时捕获和处理视频流。 在开发过程中,使用`javacv-platform-1.5.4`时,你需要将压缩包中的jar文件添加到项目的类路径中,以便能够访问和...
FFmpeg是一个强大的多媒体处理工具,它可以处理音频和视频数据,包括编码、解码、转换、流化等操作。JavaCV提供了与FFmpeg的接口,使得在Java中进行音视频处理变得简单,例如,可以用于实时视频流的捕获和分析。 ...
Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...
在JavaCV 1.3中,你可以利用FFmpeg进行视频的编码、解码、帧提取、格式转换等操作,对于开发音视频应用非常有用。 除此之外,JavaCV还包含了Face_recognition库,这是一个基于Eigenfaces和Fisherfaces的人脸识别...
3. **流(Stream)API**:Java 8的流API允许开发者以声明性方式处理集合数据。流可以进行过滤、映射、归约等一系列操作,支持串行和并行计算。例如,`list.stream().filter(x -> x > 10).collect(Collectors.toList...
3. **流(Stream)**:流API提供了处理集合的新方式,支持并行处理和函数式编程风格,使代码更易读、更高效。 4. **Date和Time API重构**:新的java.time包替代了旧的日期和时间API,提供了更强大、更直观的时间日期...
MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问、操作MySQL数据库。在这个特定的...
### Java I/O流知识点概述 #### 一、Java I/O流基础 ...以上知识点涵盖了Java I/O流的基础概念、核心类以及高级特性,通过深入理解这些内容,开发者可以更好地利用Java的I/O功能进行高效的数据处理和通信操作。
JAVA-IO-流操作-语法/优化
Java中的流是程序进行输入输出操作的重要工具,它在处理数据传输时扮演着核心角色。流的概念源于IO(Input/Output)技术,允许程序与外部设备(如硬盘、网络、内存等)之间交换数据。Java提供了丰富的流API,涵盖了...
6. **跨平台性**:由于Java的跨平台特性,使用JavaCV开发的项目可以在不同的操作系统上运行,如Windows、Linux、Mac OS等,这极大地拓宽了JavaCV的应用范围。 7. **机器学习集成**:JavaCV还可以与流行的机器学习库...
`mysql-connector-java-5.1.27.jar`是这个驱动的一个特定版本,它允许Java开发者在他们的应用中无缝地访问和操作MySQL数据库。 MySQL连接器(JDBC驱动)是Java Database Connectivity (JDBC)的一部分,JDBC是Java ...
### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...
这些类被广泛应用于文件操作、网络通信等多个方面,是Java程序设计中不可或缺的一部分。 ### 标准输入输出流(System.in/out/err) Java中定义了三个标准的数据流,它们分别是: - **System.in**:这是标准输入流,...
在Android中,长时间运行的操作(如推流)不应在主线程执行,以免阻塞用户界面。因此,开发者可能会使用`AsyncTask`、`Thread`、`Handler`或现代的`Coroutines`来处理后台任务。 8. **UI设计和用户体验** 虽然是...
### Java实践-使用文件流操作文本文件 #### 知识点概述 1. **文件流的概念**:在Java中,文件流是用来处理文件输入输出的基本工具。它支持数据的读取与写入,对于实现数据持久化和进行输入输出操作至关重要。 2. *...
IO流在Java中被广泛用于处理数据的读取和写入,包括文件操作、设备交互以及在网络中的数据传输。Java提供了多种类型的流,分为字符流和字节流两大类。字符流处理单个字符,如Reader和Writer,而字节流处理单个字节,...
总的来说,Java的IO流体系结构复杂而强大,它提供了多种工具和策略来处理各种数据传输场景,包括文件操作、网络通信、对象序列化等。理解并熟练运用这些流可以帮助我们构建高效、可靠的Java应用程序。
首先,我们理解一下标题中的“字符流”:在Java中,字符流主要用于处理字符数据,如文本文件,它提供了对单个字符的读写操作。 字符流分为两种基本类型:`Reader`和`Writer`。`Reader`类是所有字符输入流的抽象基类...
1. KinesisClient:这是与AWS Kinesis服务交互的主要接口,提供创建、读取和管理数据流的操作。 2. Producer API:用于生产数据到Kinesis流,支持批量发送和延迟策略。 3. Consumer API:允许应用程序消费Kinesis流...