Java高级特性流库_初体验

面对结果编程

在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下

面向过程编程

面向过程编程需要编程程序让程序依次执行得到自己想要的结构

面向结果编程

流库带给我们的好处就是我们不需要知道过程, 只需要提供我们的需要, 具体怎么做由流库内部实现

1. 迭代到流代码演示

流库正如其名所示, 它处理的是大量元素.

这里可以将流库比作一个水管, 流库中的许多函数比作水龙头, 函数成立, 水龙头便打开让水流动, 函数不成立, 水龙头关闭, 锁住水.

public class FlowDemo2 {
public static void main(String[] args) throws IOException {
int count = 0;
// 读取文本文件, 其中是一段文章
String s = new String(Files.readAllBytes(Paths.get("src","a.txt")));
String[] split = s.split("\\n");
// 面向过程编程 统计段落长度大于90的数量
for (String s1 : split){
if(s1.length() > 90) count++;
} // 面向结果编程 统计段落长度大于90的数量
List<String> list = Arrays.asList(split);
System.out.println(list.stream().filter(w -> w.length() > 90).count()); // 另一种数组转流的方式
// Stream<String> stream = Arrays.stream(split);
// System.out.println(stream);
// System.out.println(stream.filter(w -> w.length() > 90)
// .count());
// System.out.println(count);
}
}

结果一致, 都为6.

2. 流的优点

  1. 更加简洁明了
  2. 能够链式操作( 每次返回的数据类型都是流 )
  3. 流不会存储元素, 节约内存
  4. 流的操作不会修改数据源
  5. 我的理解: 流是单向的, 只会单方向流动改变, 不会改变之前的状态, 流动过了就过了, 不会再回来

3. 创建流的方式

根据流的长度可以分为无限流和有限长度的流

Java中有大量API可以产生流, 假如有方法可以返回大量数据, 那么就可以查查文档看, 是否有转换为流的方法.

Stream接口生成有限长度的流的方式

//        第一种
// Stream.of(可变长参数数组)
int[] arr1 = {2, 34, 6, 8, 9, 19};
int[] arr2 = {2, 4, 5};
Stream<int[]> stream1 = Stream.of(arr1, arr2);
System.out.println(stream1.getClass()); // 第二种
int[] arr3 = {2, 34, 6, 8, 9, 19};
// 截取数组部分, 从1到2, 不包括结束
IntStream stream = Arrays.stream(arr3, 1, 3);
System.out.println(stream.sum()); // 创建空流
Stream.empty()

Stream接口生成无限流的方法

//        第三种, 创建无限流之generate
Stream<Integer> generate = Stream.generate(() -> 1);
generate.filter(w -> {
System.out.println(w);
return w>0;
}); // Stream.generate(参数为一个函数, 返回值必须是一个数,
// 该方法被不停调用并将返回值赋予流成为水流中的一员)
Stream<Double> generate1 = Stream.generate(Math::random);
// 必须有count, 否则在filter中的sout失效
generate1.filter((w) -> {
System.out.println(w);
return w>0.5;
}).count(); // 创建无限流之iterate
// Stream.iterate(种子参数, 迭代函数), 种子参数表示迭代时的初始值, 迭代函数表示每次
// 执行函数修改上一次迭代函数返回的值, 再作为本次函数的返回值返回,用下面的例子
// 种子为0, 每次基于上次的结果值加1, 流中存储的数据为0, 1, 2, 3, 4 ...
// 问题: 每次停止运行后,再次运行的迭代函数是基于上次结束的返回值, 难道是有缓存,
// 停止时打印6002, 再次运行时从6003开始
Stream<Integer> iterate = Stream.iterate(0, n -> n += 1);
iterate.filter((w) -> {
System.out.println(w);
return w>0.5;
}).count();
iterate.forEach(w -> System.out.println(w));

热烈欢迎大家看下, 一起解决上述程序最后提出的问题

总结

对流的操作加上 Lambda 表达式能够使程序更加简洁易懂, 也正是由于简洁, 不易将这种类型的程序内容书写太多, 否则过了一段时间, 自己都看不懂这段代码.

在后续对大量元素的处理, 可以优先考虑流, 而非集合

Java高级特性1_流库_初体验的更多相关文章

  1. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  2. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  3. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  4. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

  5. Java SE 8 的流库学习笔记

    前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...

  6. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  7. Java高级特性之泛型

    首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...

  8. Java高级特性——流

    以上就是这段时间学习完流的知识以后我的总结,.mmap文件可以去我的github上获取:https://github.com/xiaozhengyu/StudyNotes.git

  9. Java高级特性之反射学习总结

    老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有去学习掌握它的价值 一. 什么是反射? 二.反射能做什么? 一. 什么是反射? 用在Java身上指的是我们可以于运行时加载.探知.使用 ...

随机推荐

  1. 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建

    前言 中间件(Middleware)对于Asp.NetCore项目来说,不能说重要,而是不能缺少,因为Asp.NetCore的请求管道就是通过一系列的中间件组成的:在服务器接收到请求之后,请求会经过请 ...

  2. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

  3. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀数组

    题意:给你一个长度为n的字符串,有q个询问,每次询问一个子串s(l,r)第k次出现的位置,若子串出现次数少于k次输出-1. 解题思路:先把SA跑出来,然后对于每次询问可以由l和rank[]找到l在所有 ...

  4. centos7 RPM MySQL5.5

    一.安装MYSQL 把下载好的rpm版的mysql上传到centos7中,目前公司中最爱用的是5.5版本和5.7版本,推荐用5.5. 先安装服务端 rpm -ivh MySQL-server-5.5. ...

  5. vue bus 中央事件总线

    1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() //  全局引入mai.jsvue中央事件总 ...

  6. Q200510-01: 求部门工资最高的员工

    问题: 求部门工资最高的员工 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. +----+-------+--------+----- ...

  7. 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇

    本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现 ...

  8. Kubernetes-12:Secret介绍及演示

    Secret介绍 Secret存在的意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,可以以Volume或者环境变量的方式使用 ...

  9. [SpringBoot项目]笔记

    request&response 重定向(跳转) 301 永久跳转/302 临时跳转 工业用途 通过url判断来自手机页面,就跳转到手机对应的页面. 活动页面临时改url? 异常处理 定义一个 ...

  10. ASP.NET Core 3.x启动时运行异步任务(一)

    这是一个大的题目,需要用几篇文章来说清楚.这是第一篇.   一.前言 在我们的项目中,有时候我们需要在应用程序启动前执行一些一次性的逻辑.比方说:验证配置的正确性.填充缓存.或者运行数据库清理/迁移等 ...