Lambda学习总结(二)--Stream流
一、Stream 流
1.1 概念
官方解释:可以支持顺序和并行对元素操作的元素集合。
简单来讲,Stream 就是 JDK8 提供给我们的对于元素集合统一、快速、并行操作的一种方式。
它能充分运用多核的优势,以及配合 Lambda 表达式、链式结构对集合等进行许多有用的操作。
1.2 特征
- Pipelining: 所有中间操作都会返回流对象本身,这样多个操作可以串联成一个管道。
- 内部迭代: 通过 Iterator或者增强for的形式在集合外部进行迭代的操作叫做外部迭代,而Stream提供了内部迭代的方法,流可以直接调用遍历方法。
当使用一个流的时候,通常需要三个步骤:
获取数据源 --> 数据转换 --> 执行操作
每次转换操作时,原有的 Stream 对象不改变,返回一个新的 Stream对象。
二、获取流
java.util.stream.Stream<T> 是 Jdk 8 新添加的流接口(并不是一个函数式接口),通常有以下几种常用方式:
- 所有的 Collection集合都可以通过Stream默认方法获取流;
- Stream接口的静态方法- of可以获取数组对应的流。
2.1 根据 Collection 获取流
public class DemoGetStream {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Stream<String> listStream = list.stream();
        Set<String> set = new HashSet<>();
        Stream<String> setStream = set.stream();
    }
}
2.2 根据 Map 获取流
public class DemoGetStream {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        Stream<String> keyMapStream = map.keySet().stream();
        Stream<Object> valueMapStream = map.values().stream();
        Stream<Map.Entry<String, Object>> entryStream = map.entrySet().stream();
    }
}
2.3 根据数组获取流
public class DemoGetStream {
    public static void main(String[] args) {
        String[] strArray = {"a","b","c"};
        Stream<String> strStream= Stream.of(strArray);
        Integer[] intArray = {1,2,-3,44,100};
        Stream<Integer> intStream= Stream.of(intArray);
    }
}
三、常用方法
Stream  有很多操作方法,分为两种类型:
- 延迟方法: 返回值类型仍然是 Stream接口自身类型的方法,因此支持链式调用。
- 终结方法: 返回值类型不再是 Stream接口自身类型的方法,因此不支持链式调用。
| 方法名称 | 方法类型 | 作用 | 方法含义 | 
|---|---|---|---|
| forEach | 终结方法 | 循环 | 接收一个 Consumer 对象,将每一个流元素交给该函数进行处理 | 
| filter | 延迟方法 | 过滤 | 接收一个 Predicate 对象 作为筛选条件,将一个流筛选为另一个流 | 
| map | 延迟方法 | 映射 | 接收一个 Function 对象,将当前流中的 T 类型数据转换为 R 类型的流 | 
| count | 终结方法 | 统计 | 统计流中的个数 | 
| limit | 延迟方法 | 取前几个对象 | 对流进行截取,只取前 N 个对象 | 
| skip | 延迟方法 | 跳过前几个对象 | 对流进行截取,跳过前 N 个对象 | 
| concat | 延迟方法 | 组合 | 将两个流合并成一个流 | 
3.1 forEach 方法
格式:
void forEach(Consumer<? super T> action);
实例:
public class DemoStreamForEach {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("三国演义","红楼梦","西游记","三字经");
        stream.forEach(s -> System.out.println(s));
    }
}
3.2 filter 方法
格式:
Stream<T> filter(Predicate<? super T> predicate);
实例:
public class DemoStreamFilter {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
        stream
                .filter(s -> s.contains("三"))
                .forEach(s -> System.out.println(s));
    }
}
3.3 map 方法
格式:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
实例:
public class DemoStreamMap {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("10", "2", "33");
        Stream<Integer> integerStream = stream.map(s -> Integer.parseInt(s));
    }
}
3.4 count 方法
格式:
long count();
实例:
public class DemoStreamCount {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
        System.out.println(stream.count());
    }
}
3.5 limit 方法
格式:
Stream<T> limit(long maxSize);
实例:
public class DemoStreamLimit {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
        stream
                .limit(3)
                .forEach(s -> System.out.println(s));
    }
}
3.6 skip 方法
格式:
Stream<T> skip(long n);
实例:
public class DemoStreamSkip {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
        stream
                .skip(3)
                .forEach(s -> System.out.println(s));
    }
}
3.7 concat 方法
格式:
static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b);
实例:
public class DemoStreamConcat {
    public static void main(String[] args) {
        Stream<String> chinaBooksStream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
        Stream<String> foreignBooksStream = Stream.of("悲惨世界", "哈里波特");
        Stream
                .concat(chinaBooksStream, foreignBooksStream)
                .forEach(s -> System.out.println(s));
    }
}
Lambda学习总结(二)--Stream流的更多相关文章
- (六)jdk8学习心得之Stream流
		六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ... 
- Java8系列 (二)  Stream流
		概述 Stream流是Java8新引入的一个特性, 它允许你以声明性方式处理数据集合, 而不是像以前的指令式编程那样需要编写具体怎么实现. 比如炒菜, 用指令式编程需要编写具体的实现 配菜(); 热锅 ... 
- java8新特性学习笔记(二) 使用流(各种API)
		筛选和切片 用谓词筛选,筛选出各个不相同的元素,忽略流中的头几个元素,或将流截断至指定长度 用谓词筛选 Stream接口支持filter方法,该操作接受一个谓词(返回一个boolean的函数) 作为参 ... 
- DirectSound学习(二)--流式缓冲区
		使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据.要注意从缓冲区这时是一个环形缓冲区,声音 ... 
- easylogging++学习记录(二):流式日志
		easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ... 
- 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)
		小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优) //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ... 
- JAVA8学习——从使用角度深入Stream流(学习过程)
		Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ... 
- 010-jdk1.8版本新特性二-Optional类,Stream流
		1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ... 
- 深度分析:java8的新特性lambda和stream流,看完你学会了吗?
		1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ... 
随机推荐
- C#反射动态创建实例并调用方法
			在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ... 
- 基于OpenCV的循环行、列移动函数circShift()
			///*12 在Matlab中有个circShift()函数,可以实现行.列的循环移动 /// 在返卷积运算中,会用到这个函数.所以,在Opencv中我也定义同样 /// 功能的函数 /// 该函数有 ... 
- Python爬虫学习==>第八章:Requests库详解
			学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ... 
- 【HANA系列】SAP HANA SQL获取某字符串的位置
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL获取某字 ... 
- 【HANA系列】SAP HANA中null变成问号的问题
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA中null变成问 ... 
- 【Linux开发】linux设备驱动归纳总结(五):2.操作硬件——IO内存
			linux设备驱动归纳总结(五):2.操作硬件--IO内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ... 
- requests-html快速入门
			昨天写了requests库好!最近requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜出来,这是一个解析HTML的库,而且用起来和requests一样爽,下面就来介绍 ... 
- Linux下面查看网卡的信息
			查看linux下面网卡的速度信息 Study From 百度知道 (懒得翻墙) 1. centos机器 安装的比较全(个人比较懒 没有使用core最小化安装, 避免出问题麻烦 公司网络太垃圾) 使用 ... 
- Python内置函数Object
			英文文档 class object Return a new featureless object. object is a base for all classes. It has the meth ... 
- 如何用纯 CSS 创作出平滑的层叠海浪特效
			效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/JvmBdE 可交互视频教 ... 
