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 ...
随机推荐
- Linux系统简介以及基本操作(一)
Linux简介(操作系统) Linux发展史(了解) Linux出现于1991年,是由芬兰赫尔辛基大学学生李纳斯·托瓦兹(Linus Torvalds)偶然发现的,他当时是为了方便下载学校网站的一些视 ...
- node.js的特点与模块化开发
node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. node.js跳过了服务器,它自己不用建设在任何服务器软件之上,node.js的许多设计理念与经典架构(L ...
- c# autofac结合WebApi的使用
一.下载相关类库引用 install-package Autofac install-package Autofac.Mvc4 install-package Autofac.WebApi2 二.配置 ...
- E-MAZE_2019牛客暑期多校训练营(第二场)
题意 给出n行m列的迷宫0可走1不可走,有两个操作,操作1变换点(a,b)的值,操作2查询(1,a)到(n,b)的方案数 题解 设\(F[i][j]\)为第i-1行到达第i行第j列的方案数,若点\(( ...
- 【JavaScript】吃饱了撑的系列之JavaScript模拟多线程并发
前言 最近,明学是一个火热的话题,而我,却也想当那么一回明学家,那就是,把JavaScript和多线程并发这两个八竿子打不找的东西,给硬凑了起来,还写了一个并发库concurrent-thread-j ...
- github初学者搭建自己的网站
如何利用github打造博客专属域名 感谢园友的无私共享-- http://www.cnblogs.com/xuehaoyue/p/6551217.html 选分支 建立好库,在设置 这里选择博客类型 ...
- 每天学会一点点(HashMap实现原理及源码分析)
HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希 ...
- HBase数据迁移到Kafka实战
1.概述 在实际的应用场景中,数据存储在HBase集群中,但是由于一些特殊的原因,需要将数据从HBase迁移到Kafka.正常情况下,一般都是源数据到Kafka,再有消费者处理数据,将数据写入HBas ...
- 洛谷 P1091合唱队列
吾王剑之所指,吾等心之所向 ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...
- FreeSql (三十一)分区分表
分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中.把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,数据库不同实现方式有所不同. 与分表不同,一张大表进行 ...