支持顺序和并行聚合操作的一系列元素。
看一个JAVA 8_API(地址:https://www.matools.com/api/java8)的示例:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();分析:widgets
是Collection<Widget>,通过
Collection.stream()
创建一个Widget
对象的流,.filter()——
过滤这个流以产生仅包含红色小部件的流(这个过滤,我觉得换成保留较好,
filter()
就是保留满足方法内条件的数据),然后过滤保留后的值,通过mapToInt方法转换为表示每个红色小部件的权重的
int
值。 然后将该流相加以产生总重量。
除了Stream
,其为对象引用的流,存在原语特为IntStream
,LongStream
和DoubleStream
,所有这些都称为“流”和符合此处描述的特征和限制。
用途:对集合元素进行筛选、排序和聚合等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
实例:
public static void main(String[] args) { List<String> strings = Arrays.asList("aa","","bbbb","","cc","","dddd"); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,1,2,9,132); System.out.println("java 8 操作数组-------"); System.out.println("数组:" + strings); Long nullCount = strings.stream() .filter(s -> s.isEmpty()) .count(); List<String> nullStrings = strings.stream() .filter(s -> s.isEmpty()) .collect(Collectors.toList()); System.out.println("空字符串的数量:" + nullCount); System.out.println("空字符串:" + nullStrings); Long threeCount = strings.stream() .filter(s -> s.length()>3) .count(); List<String> threeStrings = strings.stream() .filter(s -> s.length()>3) .collect(Collectors.toList()); System.out.println("长度大于三的字符串的数量:" + threeCount); System.out.println("长度大于三的字符串:" + threeStrings); String joinStrings = strings.stream() .filter(s -> s.length()>3) .collect(Collectors.joining(",")); System.out.println("合并字符串:" + joinStrings); //获取平方数 System.out.println("数字 数组------------------"); List<Integer> squaresList = numbers.stream() .map(integer -> integer*integer) .distinct() //去重 .collect(Collectors.toList()); System.out.println("获取平方数:" + squaresList); IntSummaryStatistics statistics = numbers.stream() .mapToInt(s->s) .summaryStatistics(); System.out.println("列表中最大的数 : " + statistics.getMax()); System.out.println("列表中最小的数 : " + statistics.getMin()); System.out.println("所有数之和 : " + statistics.getSum()); System.out.println("平均数 : " + statistics.getAverage()); System.out.println("随机数: "); Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println); // 并行处理 List<String> parallelString = strings.parallelStream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("空字符串的数量为: " + parallelString); }
输出结果:
java 8 操作数组-------
数组:[aa, , bbbb, , cc, , dddd]
空字符串的数量:3
空字符串:[, , ]
长度大于三的字符串的数量:2
长度大于三的字符串:[bbbb, dddd]
合并字符串:bbbb,dddd
数字 数组------------------
获取平方数:[9, 4, 49, 25, 1, 81, 17424]
列表中最大的数 : 132
列表中最小的数 : 1
所有数之和 : 169
平均数 : 15.363636363636363
随机数:
-1605871186
-930090087
-760378224
-160815069
-155865019
-78365962
795529794
909733837
1127503219
1774549966
空字符串的数量为: [aa, bbbb, cc, dddd]
Process finished with exit code 0