Java8引入了全新的Stream API,Stream API为Java编程提供了丰富的函数式编程操作。

Stream API与Java提供的其他集合类型有本质的区别,具体如下:

java.io的InputStream/OutputStream和java.util.stream的不同 :

java.io

java.util.stream

存储

顺序读写byte / char

顺序输出任意Java对象

用途

序列化至文件 / 网络

内存计算 / 业务逻辑

java.util.List和java.util.stream的区别

java.util.List

java.util.stream

元素

已分配并存储至内存

未分配,实时计算

用途

操作一组已存在的Java对象

惰性计算

Stream的特点:

可以“存储”有限个或无限个元素

可以转换为另一个Stream

计算通常发生在最后结果的获取(惰性计算)

惰性计算: 一个Stream转换城另外一个Stream的时候只存储转换规则,并不做实质性的计算

Stream API的特点:

Stream API提供了一套新的流式处理抽象序列

Stream API支持函数式编程 / 链式操作

Stream API 可以表示无限序列,多数情况下是惰性求值的

创建Stream

创建Stream通常有两种方法种方法:

将现有数据结构转化成Stream

Stream s = Stream.of(1, 2, 3, 4, 5);

Stream s = Arrays.stream(arr);

Stream s = aList.stream();

通过Stream.generate()方法:

// 这种方法通常表示无限序列

Stream s = Stream.generate(SuppLier s);

// 创建全体自然数的Stream

class NatualSupplier implements Supplier {

BigInteger next = BigInteger.ZERO;

@Override

public BigInteger get() {

next = next.add(BigInteger.ONE);

return next;

}

}

通过其他方法返回

Stream lines = Files.lines(Path.get(filename))

...

map方法

把一种操作运算映射到Stream的每一个元素上,从而完成一个Stream到另一个Stream的转换

map方法接受的对象是Function接口,这个接口是一个函数式接口:

Stream map(Function super T, ? extends R> mapper);

@FunctionalInterface

public interface Function {

// 将T转换为R

R apply(T t);

}

map方法的使用:

// 获取Stream里每个数的平方的集合

Stream ns = Stream.of(1, 2, 3, 4, 5);

ns.map(n -> n * n).forEach(System.out::println);

filter方法

filter方法用于过滤Stream中的元素,并用符合条件的元素生成一个新的Stream。

filter方法接受的参数是Predicate接口对象,这个接口是一个函数式接口:

Stream filter(Predicate super T>) predicate;

@FunctionInterface

public interface Predicate {

// 判断元素是否符合条件

boolean test(T t);

}

filter方法的使用:

// 获取当前Stream所有偶数的序列

Stream ns = Stream.of(1, 2, 3, 4, 5);

ns.filter(n -> n % 2 == 0).forEach(System.out::println);

reduce方法

reduce方法将一个Stream的每一个元素一次作用于BiFunction,并将结果合并。

reduce方法接受的方法是BinaryOperator接口对象。

Optional reduce(BinaryOperator accumulator);

@FuncationalInterface

public interface BinaryOperator extends BiFunction {

// Bi操作,两个输入,一个输出

T apply(T t, T u);

}

reduce的使用方法:

// 求当前Stream累乘的结果

Stream ns = Stream.of(1, 2, 3, 4, 5);

int r = ns.reduce( (x, y) -> x * y ).get();

System.out.println(r);

java outputstream api,Java8 stream API以及常用方法相关推荐

  1. 在Java 8中使用Stream API列出ZIP文件的内容

    在Java 8 java.util.zip.ZipFile配备了stream方法,该方法可以非常轻松地浏览ZIP文件条目. 在此博客文章中,我将展示许多示例,这些示例显示了我们可以如何快速浏览ZIP文 ...

  2. Java8————Stream API

    引言 Java8 加入了java.util.stream包,这个包中的相关API将极大的增强容器对象对元素的操作能力. 它专注于对集合对象进行各种便利.高效的聚合操作,或大批量数据处理. Stream ...

  3. Java SE 9:Stream API的改进

    发表简要目录: (Post Brief Table of Content:) Introduction介绍 Java SE 8: Stream API BasicsJava SE 8:Stream A ...

  4. java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序

    在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Ja ...

  5. 在Java 8中使用Stream API解析文件

    Java 8中到处都有流.只需四处看看,可以肯定地找到它们. 它也适用于java.io.BufferedReader . 使用Stream API在Java 8中解析文件非常容易. 我有一个要读取的C ...

  6. Java8 Stream API 详细使用指南

    1. 概述 Java 8 引入的一个重要的特性无疑是 Stream API.Stream 翻译过来是"流",突然想到的是大数据处理有个流式计算的概念,数据通过管道经过一个个处理器( ...

  7. Java8 Stream API学习

    你可能没意识到Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了.Java 8之所以费这么大功夫引入函数式编程,原因有二: 代码简洁,函数式编程写出的代码简洁且意图明确 ...

  8. 玩转 Java8 Stream 流,常用方法,详细用法大合集!

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每一天进步一点点,是成功的开始... 一.概述 S ...

  9. Java8 Stream流的常用方法和讲解

    1 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的 Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利. 那么什么是 Stre ...

最新文章

  1. 可再生能源建设提速 风电光伏业高景气可期
  2. 【CF#2A】Winner(模拟 STL-map)☆
  3. Python之smtpd及smtplib(邮件服务器及客户端)
  4. 免費玩雲端運算,Amazon Web Service 雲端運算平台攻略 【1】
  5. c语言统计输入的字符数字的个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  6. Postgresql - MATERIALIZED VIEW
  7. Iocomp .net仿真仪表控件包
  8. 自然语言理解gpt_GPT-3:自然语言处理的创造潜力
  9. 站在HR角度之五:(群面)无领导小组面试的种种——附500强经典案例
  10. 桌上远远演唱特别行政区
  11. 如何用adb连接android手机
  12. 多线程(Thread的类的运用-Runnable类的使用/多线程的注意点)
  13. tesseract-ocr验证码识别
  14. imx6 Android gpu 内存,Use vivante GPU on IMX6 with 4.14 kernel
  15. 计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机的解决方法...
  16. SIGMOD 2017论文的摘要与看法
  17. 硬件行业知识体系概要【转】
  18. 长虹应用商店服务器连接异常,长虹电视为什么应用商店打不开,上面显示服务器或网络异常,可是网络没问题,还显示sn异常,求解……...
  19. 五次面试,程序员的悲催轮回
  20. 二叉树前中后序遍历以及节点计算

热门文章

  1. 杭电第七次作业c语言短学期,杭电短学期:算法与编程.doc
  2. java exe 路径_Java程序获取执行自己的java.exe路径
  3. yolo系列外文翻译_Yolo系列其三:Yolo_v3
  4. c语言循环结构菱形九九乘法表,C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表 ....
  5. postman delete 请求传递数组_Postman请求方法
  6. 炒菜机器人放食材的顺序_2年要开1000家 碧桂园旗下千玺机器人餐厅开业
  7. 设计模式(八)组合模式 Composite
  8. 安卓开发之开启子线程以及安卓的消息机制原理
  9. django 定制admin
  10. Numpy数据的操作 * dot() multiply() 的区别