流式编程

流的一个核心好处是,它使得程序更加短小并且更易理解。

public class Demo1 {
public static void main(String[] args) {
new Random(47)
// ints() 方法产生一个流并且 ints() 方法有多种方式的重载
// — 两个参数限定了数值产生的边界。这将生成一个整数流
.ints(5,60)
.distinct()//distinct() 来获取它们的非重复值
.limit(7)//使用 limit() 方法获取前 7 个元素
.sorted()//使用 sorted() 方法排序
// forEach() 方法遍历输出,它根据传递给它的函数对每个
// 流对象执行操作。
.forEach(System.out::println);
// 我们传递了一个可以在控制台显示每个元素的方法引用。System.out::println
}
}

流操作的类型有三种:创建流,修改流元素(中间操作, Intermediate Operations),消费流元素(终端操作, Terminal Operations)。

创建流
public class BuildUp {
public static void main(String[] args) {
Stream.of("aaa","bbb","vvv").forEach(System.out::print);
Stream.of(1111,2222,3333).forEach(System.out::print); //从 Map 集合中产生流数据,。然后分别调用 getKey() 和 getValue() 获取值。
Map<String,Double> m = new HashMap<>();
m.put("AA",1.1);
m.put("BB",1.3);
m.put("DDD",3.1);
m.put("CCC",2.1); //我们首先调用 entrySet() 产生一个对象流,每个对象都包含一个 key 键以及与其相关联的 value 值
// 将对象作为e参数传到后面,
m.entrySet().stream().map(e -> e.getKey()+":"+
e.getValue()).forEach(System.out::println);
}
}

generate()

/*
Supplier 接口有一个方法就是get
*/
public class Generate implements Supplier<String>{
Random rand = new Random(47);
char[] letters = "ABCDEFGHIJK".toCharArray();
// 重写接口中的函数,返回String类型值
public String get(){
// 在指定的数组里面挑选字母
// Random.nextInt() 的参数代表可以接受的最大的随机数范围
return "" + letters[rand.nextInt(letters.length)];
} public static void main(String[] args) {
String word = Stream.generate(new Generate()).limit(20)
.collect(Collectors.joining());
System.out.println(word);
System.out.println("#######################");
Stream.generate(() -> "done").limit(3)
.forEach(System.out::println); }
}

Stream.iterate()

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

返回有序无限连续 Stream由函数的迭代应用产生 f至初始元素 seed ,产生 Stream包括 seed , f(seed) , f(f(seed)) ,等 

以种子(第一个参数)开头,并将其传给方法(第二个参数)。方法的结果将添加到流,并存储作为第一个参数用于下次调用 iterate()

Stream<T> skip(long n)

在丢弃流的第一个 n元素后,返回由该流的 n元素组成的流。
public class Fibonacci {
int x =1;
// 匿名函数
Stream<Integer> numbers(){
// lambada表达式的函数
return Stream.iterate(0,i ->{
int result = x +i;
x = i;
return result;
});
} public static void main(String[] args) {
new Fibonacci().numbers()
.skip(10)
.limit(10)
.forEach(System.out::println);
} }
/*
斐波那契数列就是签两个数相加得到写一个元素
55
89
144
233
377
610
987
1597
2584
418
*/

流的建造者模式

static <T> Stream.Builder<T> builder()

返回一个 Stream的构建器。
public class FileTo {
// 建立构建器,builder
Stream.Builder<String> builder = Stream.builder();
public FileTo(String fp) throws Exception{
Files.lines(Paths.get(fp))
.skip(1)
//
.forEach(line ->{for (String w:line.split("[ .?,]+"))//以上面做分割
builder.add(w);//分割完的部分加入流构建器里面
});
}
Stream<String> stream(){
return builder.build();
} public static void main(String[] args) throws Exception {
// 实例化流对象
new FileTo("src/flow/FileTo.java")
.stream()
.limit(7)
.map(w -> w +" ")
.forEach(System.out::print);
}
}
/*
import java nio file Files; import
*/

注意,构造器会添加文件中的所有单词(除了第一行,它是包含文件路径信息的注释),但是其并没有调用 build()。只要你不调用 stream() 方法,就可以继续向 builder 对象中添加单词。

在该类的更完整形式中,你可以添加一个标志位用于查看 build() 是否被调用,并且可能的话增加一个可以添加更多单词的方法。在 Stream.Builder 调用 build() 方法后继续尝试添加单词会产生一个异常。

Arrays.stream()

Arrays 类中含有一个名为 stream() 的静态方法用于把数组转换成为流

public class Demo2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("DDD");
list.add("EEE");
System.out.println(list); list.stream().forEach(System.out::println);
}
}

stream() 同样可以产生 IntStream,LongStream 和 DoubleStream。

public class IntLongDouble {

    public static void main(String[] args) {
// int stream
Arrays.stream(new int[] {1,2,3,4,5})
.forEach(n -> System.out.format("%d ",n));//lamabad表达式
System.out.println();
System.out.println("#######################");
//指定从哪里开始到哪里结束,左闭右开区间
Arrays.stream(new double[] {1.1,2.2,3.3,4.4,5.5,6.6,7.7},3,6)
.forEach(n -> System.out.println(n));
System.out.println("##############"); Arrays.stream(new long[] {111111,444444,444999})
.forEach(System.out::println);//引用 }
}

中间操作之跟踪和调试

java-流式编程的更多相关文章

  1. 20190827 On Java8 第十四章 流式编程

    第十四章 流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解.当 Lambda 表达式和方法引用(method references)和流一起使用的时候会让人感觉自成一体.流使得 Java ...

  2. Stream流式编程

    Stream流式编程   Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个 ...

  3. JDK8新特性(二) 流式编程Stream

    流式编程是1.8中的新特性,基于常用的四种函数式接口以及Lambda表达式对集合类数据进行类似流水线一般的操作 流式编程分为大概三个步骤:获取流 → 操作流 → 返回操作结果 流的获取方式 这里先了解 ...

  4. Java反应式编程(1)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面把Java函数式编程的由来和最主要的核心知识点讲完了.包括比较难懂的Lambda表达式是怎么演变而来的也全部都撸了一遍.Lambda表达式这 ...

  5. Java 链式编程

    这里来做一个Java 链式编程的例子,基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性. package com.sun; public class Demo05 { /** * @pa ...

  6. JAVA流式布局管理器--JAVA基础

    JAVA流式布局管理器的使用: FlowLayoutDeme.java: import java.awt.*;import javax.swing.*;public class FlowLayoutD ...

  7. golang的极简流式编程实现

    传统的过程编码方式带来的弊端是显而易见,我们经常有这样的经验,一段时间不维护的代码或者别人的代码,突然拉回来看需要花费较长的时间,理解原来的思路,如果此时有个文档或者注释写的很好的话,可能花的时间会短 ...

  8. Java流式思想和方法引用

    目录 Java流式思想和方法引用 1. Stream流 1.1 概述 传统集合的多步遍历代码 Stream的更优写法 1.2 流式思想的概述 1.3 获取流 1.4 常用方法 ①逐一处理:forEac ...

  9. JAVA 流式布局管理器

    //流式布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian2 extends JFrame{ //定义组件 JBut ...

  10. Spark流式编程介绍 - 编程模型

    来源Spark官方文档 http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#programm ...

随机推荐

  1. Wireshark教程之过滤器设置

    实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.抓取特定数据流 2.显 ...

  2. 通过ILSpy反编译工具和ilasm修改.NET程序

    文章来源:https://blog.peos.cn/2016/12/26/ilspy-ilasm-ildasm-net.html 金庸群侠传X中,田青文.木婉清.王语嫣的点穴游戏忒难过了,所以上网摸索 ...

  3. C#(1):XML DOM、System.Xml.XmlDocument

     一.XML DOM概述 XML 文档大小写敏感.属性用引号括起来,每一个标记都要闭合. DOM是XML文档的内存中树状的表示形式. 继承关系图: XmlNode;//XML节点 ......Xml ...

  4. Qt:QUrl

    1.说明 概述 一个代表URL的类,此外还支持国际域名(IDNs). 通常在初始化时传入QString构造QUrl,除此之外还能用setUrl(). URL有两种表示格式:编码.未编码.未编码URL常 ...

  5. QT:中文字符串与“常量中有字符串”报错

    解决方法参照: (10条消息) Qt5.9 win7系统 中文字符串报错:常量中有字符串_Be busy living or busy dying-CSDN博客 主要是用QStringLiteral( ...

  6. IIS部署vue项目页面刷新404,url重写问题解决办法

    这里需要用到URL重写工具 --URL Rewrite(默认没有,需要自己下载安装) 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开IIS在管理 ...

  7. LeetCode-048-旋转图像

    旋转图像 题目描述:给定一个 n × n 的二维矩阵 matrix 表示一个图像.请你将图像顺时针旋转 90 度. 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要 使用另一个矩 ...

  8. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  9. MATLAB神经网络应用设计【1】

    基于看到一个博客的大佬说自己学的东西太多了,很容易遗忘.我觉得我目前也出现这样的问题了,所以在这里开了博客,开始记录整理自己的学习之旅.   今天看了这本书的前几章,看这个书的目的是为了1个多月后的数 ...

  10. 如何恢复 iCloud 已删除文件

    原文链接 问题 今天在查找之前的 C++ 笔记时,突然发现之前的资料全没了,整个 Cpp 文件夹内就只剩下了三个文件,怎么形容当时的心情呢,应该说是一下就跌倒了谷底,感觉之前的心血全白费了,有种深深的 ...