JAVA 8 新特性Stream初体验
什么是 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初体验的更多相关文章
- Java 8 新特性-Stream更优雅的处理集合入门
Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...
- 再来看看Java的新特性——Stream流
半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...
- Java 8 新特性---------Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象 ...
- Java 8新特性--Stream API
Java 8 API添加了一个新的抽象称为流Stream,以一种声明的方式处理数据,可以极大提高程序员的生产力,写出高效.干净.简洁的代码.这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可 ...
- Java 8 新特性——Lambdas 表达式
本文内容 引入 测试数据 collect(toList()) map filter flatMap max 和 min reduce 整合操作 参考资料 Java 8 对核心类库的改进主要包括集合类的 ...
- Java 12 新特性介绍,快来补一补
Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...
- Java 8 新特性之 Stream 流基础体验
Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...
- Java 8新特性之旅:使用Stream API处理集合
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
- java新特性stream
java新特性stream,也称为流式编程. 在学习stream之前先了解一下java内置的四大函数 第一种函数式函数,后面是lambda表达式写法 /*Function<String,Inte ...
随机推荐
- Delphi - Indy TIdHTTP方式创建程序外壳 - 实现可执行程序的自动升级
Delphi 实现可执行程序的自动升级 准备工作: 1:Delphi调用TIdHTTP方式开发程序,生成程序打包外壳 说明:程序工程命名为ERP_Update 界面布局如下: 代码实现如下: unit ...
- Oracle - View
Oracle View的创建 Create Or Replace View ViewName As Select * From Tables/View Where 条件;
- Python 命令行之旅:使用 argparse 实现 git 命令
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- MySQL性能调优与架构设计(简朝阳)
https://www.cnblogs.com/crazylqy/category/625963.html
- python实现持久化存储,操作表格,时间戳
import xlrd,xlwt,pickle,time,datetime book = xlrd.open_workbook("练习.xlsx") sheet1 = book.s ...
- Go从入门到放弃
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
- Java 字符串常量存放在堆内存还是JAVA方法区?
JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池. JDK1.8开始,取消了Java方法区,取而代之的是位于直接内 ...
- [0]尝试用Unity3d制作一个王者荣耀(持续更新)->游戏规划
太得闲了于是想写个农药,虽然可能会失败但是还是要试一试. 因为是自学的不是Unity专业的可能表达语言会有些不标准!望见谅! 结构: 以组件式(比如说摇杆控制和玩家部分的编写是分离的,可以自由拼装)作 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- HTML连载37-边框属性(下)、边框练习
一.边框属性 1.连写(分别设置四条边的边框) border-width:上 右 下 左: border-style:上 右 下 左: border-color:上 右 下 左: 注意点: (1)这三 ...