什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • <strong元素队列< strong="">元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

题目:

  有一个集合,里面存放字符串如:"小王,98"、"小李,95"、"小陈,87",要求打印输出所有成绩当中大于90分的数字。

常规写法

     public static void main(String[] args) {
ArrayList<String> arrayList=new ArrayList<String>();
arrayList.add("小王,98");
arrayList.add("小李,95");
arrayList.add("小陈,87");
for (int i = ; i < arrayList.size(); i++) {
String record=arrayList.get(i);
String score=record.split(",")[];
int num =Integer.parseInt(score);
if (num>) {
System.out.println(num);
}
}
}

Stream方式

     public static void main(String[] args) {
ArrayList<String> arrayList=new ArrayList<String>();
arrayList.add("小王,98");
arrayList.add("小李,95");
arrayList.add("小陈,87");
arrayList.stream().map(s->s.split(",")[]).map(Integer::parseInt)
.filter(n -> n > ).forEach(System.out::println);
}

Stream方法详细介绍

     public static void main(String[] args) {
//1.根据集合获取流
ArrayList<String> arrayList=new ArrayList<String>();
arrayList.add("小陈");
arrayList.add("小王");
arrayList.add("小李");
Stream<String> streamA=arrayList.stream(); //2.根据数组获取流,数组当中的元素必须是引用类型才行
String[] arrayStr= {"Hello","World","Java"};
Stream<String> streamB=Stream.of(arrayStr); Integer[] arrayIntegers= {10,20,30};
Stream<Integer> streamC=Stream.of(arrayIntegers);
}

几种获取流方式

一、生成流

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

串行流

     public static void main(String[] args) {
//生成流,并筛选出不是空字符串的集合
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
for (int i = ; i < filtered.size(); i++) {
System.out.println(filtered.get(i));
}
}

并行流

     public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println(count);
}

二、forEach

  • Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。
     public static void main(String[] args) {
//使用forEach遍历打印集合中的数字
ArrayList<Integer> arrayList=new ArrayList<Integer>();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.stream().forEach(System.out::println);
}

三、map

  • map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
     public static void main(String[] args) {
//使用map输出元素对应的平方
List<Integer> numbers = Arrays.asList(,,,,,);
numbers.stream().map(i->i*i).forEach(System.out::println);
}

四、filter

  • filter 方法用于通过设置的条件过滤出元素。
     public static void main(String[] args) {
//使用 filter 方法过滤空字符串的个数
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
long count = strings.stream().filter(string -> string.isEmpty()).count();
System.out.println(count);
}

五、limit

  • limit 方法用于获取指定数量的流。
     public static void main(String[] args) {
//使用 limit 方法打印出 3 条数据:
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.stream().limit().forEach(System.out::println);
}

六、sorted

  • sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
     public static void main(String[] args) {
//使用 sorted 方法集合中的元素排序:
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.add();
arrayList.stream().sorted().forEach(System.out::println);
}

七、Collectors

  • Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
     public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);
}

八、统计

  • 一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
     public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(, , , , , , ); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());
}

JAVA 8 新特性Stream初体验的更多相关文章

  1. Java 8 新特性-Stream更优雅的处理集合入门

    Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...

  2. 再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  3. Java 8 新特性---------Stream

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象 ...

  4. Java 8新特性--Stream API

    Java 8 API添加了一个新的抽象称为流Stream,以一种声明的方式处理数据,可以极大提高程序员的生产力,写出高效.干净.简洁的代码.这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可 ...

  5. Java 8 新特性——Lambdas 表达式

    本文内容 引入 测试数据 collect(toList()) map filter flatMap max 和 min reduce 整合操作 参考资料 Java 8 对核心类库的改进主要包括集合类的 ...

  6. Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...

  7. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  8. Java 8新特性之旅:使用Stream API处理集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  9. java新特性stream

    java新特性stream,也称为流式编程. 在学习stream之前先了解一下java内置的四大函数 第一种函数式函数,后面是lambda表达式写法 /*Function<String,Inte ...

随机推荐

  1. NLP(十九) 双向LSTM情感分类模型

    使用IMDB情绪数据来比较CNN和RNN两种方法,预处理与上节相同 from __future__ import print_function import numpy as np import pa ...

  2. 2019 Multi-University Training Contest 1

    2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...

  3. 51nod 1376 最长递增子序列的数量(不是dp哦,线段树 +  思维)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 题解:显然这题暴力的方法很容易想到就是以每个数为结尾最 ...

  4. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan(dfs+数学思想)

    题目链接:http://codeforces.com/contest/742/problem/C 题意:题目比较难理解,起码我是理解了好久,就是给你n个位置每个位置标着一个数表示这个位置下一步能到哪个 ...

  5. codeforces 161 D. Distance in Tree(树形dp)

    题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...

  6. CF937B Vile Grasshoppers

    Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. 【LeetCode】46-全排列

    题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [ ...

  8. Spring boot出现Cannot determine embedded database driver class for database type NONE

    在spring boot项目中,我们在pom.xml文件中添加了mysql和mybatis的依赖,我们常常遇到下面这样的问题: Description: Cannot determine embedd ...

  9. yum rpm apt-get wget 辨析

    1)wget: 类似于迅雷,是一种下载工具,通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理名字是World Wide Web”与“get”的结合.类似于cur ...

  10. 人工智能-智能创意平台架构成长之路(四)-丰富多彩的banner图生成解密第一部分(对标阿里鹿班的设计)

    我们之前讲了很多都是平台架构的主体设计,应用架构设计以及技术架构的设计,那么现在我们就来分享一下丰富多彩的banner图是怎么生成出来的. banner图的生成我们也是不断的进行迭代和优化,这块是最核 ...