博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JUC - Java8流式编程
阅读量:3916 次
发布时间:2019-05-23

本文共 2407 字,大约阅读时间需要 8 分钟。

Stream流

在这里插入图片描述

  1. 流的基本概念
    • 什么是流 :
      • Stream是操作集合的一种计算数据的工具 集合就是数据,Stream是计算集合中的数据的工具 流是Java8引入的全新概念(Java8 新特性)它用来处理集合中的数据,暂且可以把它理解为一种高级集合
      • 集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码 因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容易出错的多线程代码了
    • 流的特点
      • 只能遍历一次:我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,那么这些元素就被“消费掉了”,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍
    • 采用内部迭代方式:若要对集合进行处理,则需我们手写处理代码,这就叫做外部迭代 而要对流进行处理,我们只需告诉流我们需要什么结果,处理过程由流自行完成,这就称为内部迭代
  2. 在使用流式编程之前需要前置知识 四大函数式接口 这四种函数式接口就是我们通常使用的方法的一种抽象 如 Function接口就是一种方法 一个输入 一种返回值
    在这里插入图片描述
    • 函数型接口Function:有一个输入,一个返回值
      • 源码:

        在这里插入图片描述

      • 代码演示:获取字符串长度

        public static void main(String[] args) {
        String string = "我就是一个字符串!"; // 函数式接口能使用Lambda表达式 这里不是重点 不在详述 int length = getLength(string, (str) -> str.length()); System.out.println(length); } // 获取字符串的长度 private static int getLength(String string, Function
        function){
        return function.apply(string); }
    • 断定型接口Predicate:有一个输入,返回布尔值
      • 源码:

        在这里插入图片描述

      • 代码演示: 筛选出名字长度为两个字的人名

        public static void main(String[] args) {
        List
        list = Arrays.asList("张三", "李四", "王五", "赵六", "黄飞鸿", "王麻子"); List
        stringList = screenName(list, (str) -> str.length() == 2); System.out.println(stringList);} private static List
        screenName(List
        list, Predicate
        predicate){
        List
        nameList = new ArrayList<>(); for (String s : list) { if (predicate.test(s)){ nameList.add(s); } } return nameList;}
    • 消费型接口Consumer:有一个输入参数,没有返回值
      • 源码
        在这里插入图片描述
      • 代码演示:吃包子付钱
        public static void main(String[] args) {
        payMoney(6, (num) -> System.out.println("包子一共是"+num * 2 +"元钱") );}private static void payMoney(int baozi, Consumer
        consumer){
        consumer.accept(baozi);}
    • 供给型接口Supplier:没有输入,只有返回参数
      • 源码:

        在这里插入图片描述

      • 代码演示:

        public static void main(String[] args) {
        Employee employee = getEmployee(() -> new Employee()); System.out.println(employee);}private static Employee getEmployee(Supplier
        supplier){
        Employee employee = supplier.get(); return employee;}
  3. 流的操作种类 流的操作分为两种,分别为中间操作 和 终端操作

转载地址:http://mfxrn.baihongyu.com/

你可能感兴趣的文章
VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100.dll, xxx100d.dll等的解决方法
查看>>
Ansi、Unicode、UTF-8字符串之间的转换和写入文本文件
查看>>
utf-8与utf-8(无BOM)的区别
查看>>
把一个int()或者byte(字节)以二进制的形式打印出来
查看>>
从windows同步文件到linux
查看>>
SSH tunnel tips
查看>>
数据库索引的作用和优点缺点
查看>>
printf()用法
查看>>
c++ 启动exe(启动别的exe程序)
查看>>
Dynamic Forking of Win32 EXE
查看>>
重载CDialog::PreCreateWindow是无效的
查看>>
vs2012窗口布局恢复
查看>>
WINDOWS下的ANSI字符串和UTF8字符串之间的相互转换
查看>>
第八章 右左法则----复杂指针解析
查看>>
使用CFileFind遍历递归删除文件和文件夹
查看>>
使用opencv 录摄像头数据到文件
查看>>
error C1189:#error:This file requires _WIN32_WINNT to be #defined at least to 0x0403
查看>>
CentOS yum 源的配置与使用
查看>>
error while loading shared libraries: libevent-2.0.so.5 安装好mamcache,启动服务时
查看>>
c++ web编程:写出你的CGI程序
查看>>