流相关的接口和类在java.util.stream包中。
AutoCloseable接口来自java.lang包。
所有流接口从继承自AutoCloseable接口的BaseStream接口继承。
AutoCloseable | +--BaseStream | +--IntStream | +--LongStream | +--DoubleStream | +--Stream<T>
如果流使用集合作为其数据源,并且集合不需要关闭。
如果流基于可关闭的数据源(例如文件I/O通道),那么我们可以使用try-with-resources语句创建流,以使其自动关闭。
BaseStream接口定义所有类型的流的所有方法。
Stream<T>
接口表示元素类型T的流。
流<Student> 表示学生对象流。
Stream <T>接口包含诸如filter(),map(),reduce(),collect(),max(),min()等。
当使用原始类型时,我们可以使用三个专门的流接口,称为IntStream,LongStream和DoubleStream。
这些接口提供了处理原始值的方法。
对于其他基本类型,例如float,short,byte,我们仍然可以使用三个专用流接口。
在下面的代码中,我们将使用stream来计算列表中所有奇整数的平方和。
我们将使用以下步骤进行计算。
Collection接口中的stream()方法返回一个顺序流。 这样,集合充当数据源。
下面的代码创建一个List <Integer>并从列表中获取一个Stream <Integer>
List<Integer> numbersList = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> numbersStream = numbersList.stream();
如果指定的谓词对于该元素返回真,Stream<T> filter()使用Predicate<T>来保留元素。
以下语句获取仅奇数整数的流:
Stream< Integer> oddNumbersStream = numbersStream.filter(n - > n%2 == 1);
Stream< T>
map()使用一个Function来映射每个元素在流中创建新流。
以下语句将流映射到其正方形:
Stream<Integer> aStream = stream.map(n -> n * n);
reduce(T identity,BinaryOperator<T>累加器)
将流减少到单个值。
它采用一个初始值和一个 BinaryOperator<T>
作为参数的累加器。
reduce(T identity,BinaryOperator< T>累加器)
使用所提供的初始值和关联累积函数对该流的元素执行减少,并返回减小的值。
这相当于:
T result = identity; for (T element : this stream) result = accumulator.apply(result, element) return result;
以下代码将流中的所有整数相加。
int sum = aStream.reduce(0, (n1, n2) -> n1 + n2);
Integer.sum()
方法执行两个整数的和。
我们可以使用方法引用重写代码。
int sum = aStream.reduce(0, Integer::sum);
以下代码将每个步骤链接在一起。
import java.util.Arrays; import java.util.List; 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); } }
上面的代码生成以下结果。
流可以是有序的或无序的。
有序流保持其元素的顺序。
Streams API可以将有序流(其可以表示有序数据源,例如列表或有序集)转换成无序流。
我们还可以通过应用排序中间操作将无序流转换为有序流。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(3,7,9,3,1,2,1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 1) .sorted() .forEach(System.out::println); } }
上面的代码生成以下结果。
在 Java 语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:type identifier [ = value][, identifier [= value] .....
本章节我们主要向大家介绍一下Java Character类,以及Character类的用法。Java Character类 使用字符时,我们通常使用的是内置数...
正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中...
什么是异常?程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生...
Java 发送邮件 使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework...