说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带
来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

循环遍历的弊端

Java 8的Lambda让我们可以更加专注于做什么(What),而不是怎么做(How),这点此前已经结合内部类进行
了对比说明。现在,我们仔细体会一下上例代码,可以发现

  1. for循环的语法就是“怎么做”
  2. for循环的循环体才是“做什么”

为什么使用循环?因为要进行遍历。但循环是遍历的唯一方式吗?遍历是指每一个元素逐一进行处理,而并不是从
第一个到最后一个顺次处理的循环。前者是目的,后者是方式。

每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循
环是做事情的方式,而不是目的。另一方面,使用线性循环就意味着只能遍历一次。如果希望再次遍历,只能再使用另一个循环从头开始。

public class Main {public static void main(String[] args) {//创建一个list集合储存姓名List<String> list=new ArrayList<>();list.add("小刘");list.add("小赵");list.add("小宝贝");list.add("老王");list.add("老王八");//过滤以“小”开头为的字符list.stream().filter(s->s.startsWith("小"))//过滤字符长度为3的.filter(s->s.length()==3)//遍历stream集合.forEach(s-> System.out.println(s));}
}
打印结果:小宝贝

直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤以"小"开头、过滤长度为3、逐一打印。代码
中并没有体现使用线性循环或是其他任何算法进行遍历,我们真正要做的事情内容被更好地体现在代码中。
stream的常用方法

  • 逐一处理:forEach
    虽然方法名字叫 forEach ,但是与for循环中的“for-each”昵称不同。
public class Main {public static void main(String[] args) {//获取一个stream流Stream<String> stream=Stream.of("小张","老王","小刘","小花");//使用stream流中的方法foreach对stream流中的数据进行遍历stream.forEach(s-> System.out.println(s));
打印结果:
小张
老王
小刘
小花
  • 过滤:filter
    可以通过 filter 方法将一个流转换成另一个子集流。
public class Main {public static void main(String[] args) {//创建一个stream流Stream<String> stream = Stream.of("萧炎", "萧熏儿", "萧战", "药老", "美杜莎");//对stream流中的元素过滤,只要姓萧的人Stream<String> stream1 = stream.filter(s -> s.startsWith("萧"));//遍历stream1流stream1.forEach(s-> System.out.println(s));}
}
打印结果:
萧炎
萧熏儿
萧战

在这里通过Lambda表达式来指定了筛选的条件:必须姓张。

  • Stream流的特点:只能使用一次
    Stream流属于管道留,只能被消费(使用)一次,第一个Stream流调用完毕方法,数据就会流转到下一个Stream上,而这是第一个stream流已经使用完毕就会关闭。所以第一个stream流就不能调用方法了

  • 映射:map
    如果需要将流中的元素映射到另一个流中,可以使用 map 方法。

public class Main {public static void main(String[] args) {//获取一个String类型的stream流Stream<String> stream = Stream.of("1", "2", "3", "4", "5");//使用map方法,把字符串类型的整数,转换(映射)成Integer类型的整数Stream<Integer> stream1= stream.map((String s) -> {return Integer.parseInt(s);});//遍历stream1stream1.forEach(s-> System.out.println(s));}
}
打印结果:
1
2
3
4
5

这段代码中, map 方法的参数通过方法引用,将字符串类型转换成为了int类型(并自动装箱为 Integer 类对象)。

  • 统计个数:count
    count用于统计Stream流中元素的个数
 long count();

count方法是一个终结方法,返回值是一个long类型的整数,所以不能继续调用Stream流中的其他方法

public class Main {public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("1");list.add("123");list.add("145");list.add("481");list.add("691");Stream<String> stream = list.stream();long count = stream.count();System.out.println(count);}}
打印结果:
5
  • 取用前几个:limit
    limit 方法可以对流进行截取,只取用前n个
public class Main {public static void main(String[] args) {// 获取stream流Stream<String> stream = Stream.of("张三", "李斯", "王五", "赵六", "田七");Stream<Stream<String>> stream1 = Stream.of(stream);//使用limit对Siream流中的元素进行截取,只要前三个元素Stream<String> stream2 = stream.limit(3);//遍历stream2stream2.forEach(s-> System.out.println(s));}}
打印结果:
张三
李斯
王五
  • 跳过前几个:skip
    如果希望跳过前几个元素,可以使用 skip 方法获取一个截取之后的新流
public class Main {public static void main(String[] args) {// 获取stream流Stream<String> stream = Stream.of("张三", "李斯", "王五", "赵六", "田七");Stream<Stream<String>> stream1 = Stream.of(stream);//使用skip方法,跳过前三个元素Stream<String> stream2 = stream.skip(3);//遍历stream2.forEach(s-> System.out.println(s));}}
打印结果:
赵六
田七
  • 组合:concat
    如果有两个流,希望合并成为一个流,那么可以使用 Stream 接口的静态方法 concat
public class Main {public static void main(String[] args) {// 获取stream流Stream<String> stream1 = Stream.of("张三", "李斯", "王五", "赵六", "田七");// 获取stream流Stream<String> stream2 = Stream.of("萧炎", "萧熏儿", "萧战", "药老", "美杜莎");//把两个流组合成一个流Stream<String> concat = Stream.concat(stream1, stream2);//遍历concat.forEach(s-> System.out.println(s));}}
打印结果:
张三
李斯
王五
赵六
田七
萧炎
萧熏儿
萧战
药老
美杜莎

Stream流—常用简单方法相关推荐

  1. Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  2. Java中 方法引用、Stream流、及方法实例 D190401

    Java中 方法引用.Stream流.及方法实例 D190401 01.第三章:方法引用_什么是方法引用 1).什么是"方法引用":指引用现有的方法代替Lambda表达式--当我们 ...

  3. JDK8新特性简介、Lambda表达式、Stream流常用api介绍

    JDK8新特性简介.Lambda表达式.Stream流常用api介绍 接口 Java1.8前接口中是不允许有普通方法的,在Java1.8后允许接口中有普通方法,只需要加上default关键字即可: J ...

  4. java8函数式编程之Stream流处理的方法和案例讲解

    函数式编程最早是数学家阿隆佐·邱奇研究的一套函数变换逻辑,又称Lambda Calculus(λ-Calculus),所以也经常把函数式编程称为Lambda计算. 为什么Java需要Lambda表达式 ...

  5. list的stream流常用用法

    1.list的stream流常用用法 代码功能示例类型如下: 1.过滤 2.bigdecimal求和 3.字符串拼接 4.取出list的某个字段 5.list集合依据某个字段进行正序 6.list集合 ...

  6. Stream流中collect方法

    Stream流中collect方法 一.收集Stream流到集合和指定集和中 1.示例 2.结果 二.收集 Stream 流中的数据到数组中 1.示例 2.结果 三.Stream流中数据聚合/分组/分 ...

  7. Stream流中map方法

    Stream流中map方法 使用Stream流时发现其中的map方法使用有一些不太容易理解的地方,分析一下具体的流程,以一个小案例详细探讨Stream中map的使用. 案例涉及: 1.Stream中o ...

  8. 使用Stream流的map()方法,将每个元素封装为一个Person对象。 *  将新流中的元素提取为List集合。

    一 编程题[Stream流]* 1.4 题目(有难度)* 1.定义一个Person类,包含一个属性:姓名(String)* 定义无参.全参构造方法* 定义get/set方法* 2.定义main()方法 ...

  9. JDK8新特性(六)之Stream流的forEach()方法

    Stream流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种: 终结方法:返回值类型不再是Stream类型的方法,不再支持链式调用,上述列出的列表中终结方法包括count和forE ...

最新文章

  1. linux下activemq安装与配置
  2. devDependencies和dependencies的区别
  3. session_unset()和session_destroy()的区别
  4. C# Keycode对照表
  5. 软件著作权 开源框架_开源软件分享-基于.net core 3.1的快速开发框架
  6. jetty NoSuchFieldError: MAX_INACTIVE_MINUTES
  7. CRM Web Client UI异步搜索介绍
  8. 云上应用系统数据存储架构演进
  9. Ubuntu c++调用python脚本(Anaconda)
  10. [论文评析] ArXiv-2021,Pyramid Vision Transformer A Versatile Backbone for Dense Prediction without Convo
  11. validated 验证数组_SpringBoot整合表单验证注解@Validated,以及分组验证
  12. RedHat配置阿里yum源
  13. 峰值性噪比matlab,PSNR峰值信噪比matlab实现
  14. C语言 execve()函数使用方法
  15. 网络安全中常见的攻击方式
  16. 你好,C++(2)1.3 C++世界版图1.4 如何学好C++
  17. iframe标签(属性介绍(sandbox、srcdoc、scrolling)、iframe对象、onload事件、父集获取iframe内节点(同源和不同源情况)、domain修改规则和示例)
  18. it计算机职业评估,最新澳洲技术移民评估ACS 职业评估(计算机IT类)
  19. 企业邮箱WebMail协助办公功能盘点
  20. Win10远程桌面连接不上Win7的桌面的一次奇葩经历

热门文章

  1. 夺金时刻!新钛云服连斩三项奖牌!
  2. MySQL修改字段语句
  3. 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
  4. linux电视连接wifi,电视连接wifi网怎么弄 电视连接wifi网方法介绍【图文】
  5. 运动会计算机学院的方队,急求计算机学院运动会方队口号
  6. 公式3.0 常用字体设置
  7. 推荐5款压箱底的小工具软件
  8. 【Linux网络编程】深入理解Linux五种网络IO模型
  9. 【Unity2D】实现人物跳跃二段跳以及掉落的动画和代码
  10. 微笑大大分享的文章-数据rm-rf后的恢复案例 先复制了 备用