Stream流

Java 8 API添加了一种新的机制——Stream(流)。Stream和IO流不是一回事。

流式思想:像生产流水线一样,一个操作接一个操作。

使用Stream流的步骤:数据源→转换成流→操作1→操作2→……

数据源(source):可以是集合、数组等。

Stream操作有两个基础特征:

(1)Pipelining(流水线):流操作会返回流对象(新的对象),以便后续继续进行流操作。

(2)内部迭代:不需要像for循环或Iterator一样进行显式的迭代。

import java.util.*;
public class TestStream {
public static void main(String[] args) {
List<String> lst = new ArrayList<>();
lst.add("孙悟空");
lst.add("猪八戒");
lst.add("沙僧");
lst.add("唐僧");
// 需求:(1)筛选名字是3个字的人,(2)输出结果
System.out.println("-----流式写法");
// .stream():把集合转换成流
// .filter的参数是Predicate接口,抽象方法test()方法用于判断
// .forEach的参数是Consumer接口,抽象方法accept()用于接受数据
lst.stream().filter(name -> name.length() == 3)
.forEach(name -> System.out.println(name));
System.out.println("------ 方法引用(关注做什么,不管怎么做)");
printStr(s -> System.out.println(s), "Lambda");
printStr(System.out::println, "方法引用");
}
static void printStr(Printable p, String s) {
p.print(s);
}
}
interface Printable {
void print(String s);
}
-----流式写法
孙悟空
猪八戒
------ 方法引用(关注做什么,不管怎么做)
Lambda
方法引用

获取流

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Stream;
public class GetStream {
public static void main(String[] args) {
// List和Set
Collection<String> c = new ArrayList<>();
Stream stream = c.stream();
// Map(分k,v,k&v三种)
Map<String, String> map = new HashMap<>();
Stream<String> stream2 = map.keySet().stream();
Stream<String> stream3 = map.values().stream();
Stream<Entry<String, String>> stream4 = map.entrySet().stream();
// 数组
Integer[] arr = { 1, 2, 3, 4, 5 };
Stream<Integer> stream5 = Stream.of(arr);
}
}

常用方法

延迟方法:返回值还是Stream接口类型。

终结方法:返回类型不是Stream。如count和forEach。

import java.util.stream.Stream;
public class TestStream {
public static void main(String[] args) {
System.out.println("-- void forEach(Consumer),accept(T)获取参数");
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.forEach(e -> System.out.println(e));
// -------------
System.out.println("-- Stream filter(Predicate),test(T)用于判断");
// 必须重新获取流,因为Stream只能被使用一次,数据流到下一个Stream上。
// 如果不重新获取,会得到异常:stream has already been operated upon or closed
stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> stream2 = stream.filter(e -> e % 2 == 0);
stream2.forEach(e -> System.out.println(e));
// -------------
stream = Stream.of(1, 2, 3, 4, 5);
System.out.println("-- Stream map(Function),R apply(T t),类型转换");
Stream<String> stream3 = stream.map(n -> "第" + n);
stream3.forEach(e -> System.out.println(e));
// -------------
stream = Stream.of(1, 2, 3, 4, 5);
System.out.println("-- Stream limit(long maxSize):取前maxSize个");
Stream<Integer> limit = stream.limit(3);
limit.forEach(e -> System.out.println(e));
// -------------
stream = Stream.of(1, 2, 3, 4, 5);
System.out.println("-- Stream skip(long n):跳过前n个");
Stream<Integer> skip = stream.skip(1);
skip.forEach(e -> System.out.println(e));
// -------------
stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> stream4 = Stream.of(11, 12, 13);
System.out.println("-- Stream concat(Stream a, Stream b):二流归一");
Stream<Integer> concat = Stream.concat(stream, stream4);
concat.forEach(e -> System.out.println(e));
// -------------
stream = Stream.of(1, 2, 3, 4, 5);
System.out.println("-- long count():终结方法");
long count = stream.count();
System.out.println(count);
}
}
-- void forEach(Consumer),accept(T)获取参数
1
2
3
4
5
-- Stream filter(Predicate),test(T)用于判断
2
4
-- Stream map(Function),R apply(T t),类型转换
第1
第2
第3
第4
第5
-- Stream limit(long maxSize):取前maxSize个
1
2
3
-- Stream skip(long n):跳过前n个
2
3
4
5
-- Stream concat(Stream a, Stream b):二流归一
1
2
3
4
5
11
12
13
-- long count():终结方法
5

Java基础教程——Stream的更多相关文章

  1. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  2. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  3. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  4. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  5. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  6. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  7. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  8. Java基础教程(5)--变量

    一.变量 1.变量的定义   正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...

  9. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

随机推荐

  1. js 小数点失精度

    解决方法思路:将小数化成整数后再作运算.具体代码如下:  /*** 加法运算,避免数据相加小数点后产生多位数和计算精度损失.** @param num1加数1 | num2加数2*/function ...

  2. 走在深夜的小码农 Seventh Day

    Css3 Seventh Day writer:late at night codepeasant 学习大纲: 1. 定位(position) 介绍 1.1 为什么使用定位 我们先来看一个效果,同时思 ...

  3. OpenCascade拓扑对象之:Face的方向、参数域和曲面间的关系

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  4. 给萌新HTML5 入门指南(二)

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们已经为大家介绍了HTML5新增的内容和基础页面布局,这篇会继续向大 ...

  5. 记录云服务器安装node

    今天买了台云服务器,准备玩玩,对于之前没接触过Linux的我是一头雾水,登陆后进去就是一个黑黑的终端,一点也不友好,所以特地记录一下登陆以及安装node的过程 先记录一下登陆 登陆方式一: 那就是账号 ...

  6. MeterSphere开发者手册

    什么是 MeterSphere MeterSphere 是一站式的开源企业级持续测试平台, 涵盖测试跟踪.接口测试.性能测试. 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和测试团队充 ...

  7. rabbitmq集群搭建,镜像队列搭建

    原文地址:https://www.jianshu.com/p/11963564dd3d 教你如何从0开始搭建rabbitmq集群 一.准备工作 1.三台centos虚拟机 2.三台虚拟机都安装了doc ...

  8. Es6-Promise初识

    Promise 含义: Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Pro ...

  9. JMeter100个线程竟然只模拟出1个并发

    线程组,是说到 JMeter 会第一时间想到的东西,也是我认为 JMeter 最难理解的知识点.因为项目让你做个压测,首先就是要考虑并发,用 JMeter 就是用多线程 来模拟多并发.但在看到线程组编 ...

  10. 记一次使用idea插件CamelCase技巧

    1.在idea中下载插件CamelCase插件  2.使用Shift+Alt+U快捷键进行转换 3.由于转换格式比较导致多次使用快捷键才能达到自己想要的效果,此插件提供了允许禁用某些转换或更改它们在首 ...