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

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

  java8中,除了Lambda表达式之外,还提供了强大的Stream API(java.util.stream.*),即流式编程。那什么是流式编程?

什么是流式编程

  Stream是Java8中处理集合的关键抽象概念,它可以指定你想对集合进行的操作,比如:进行非复杂的查询、过滤、或者映射数据等一系列的操作。Stream不是集合元素,也不是数据结构,它相当于一个高级版本的遍历器(Iterator),不能够重复遍历里面的数据,就像是流水一样,流过就不再复返了。与普通的Iterator不同的是,普通的Iterator只能是串行,而Stream可以并行操作,这样就大大提高了我们的操作速度。

在这里插入图片描述

注意:

1)Stream自己不会存储元素

2)Stream的相关操作不会改变数据源。相反地他们会返回一个含有操作结果的新的Stream

Stream操作三步曲

1)创建 Stream

一个数据源(如:集合、数组),获取一个Stream流

方法 描述
stream() 获取串行流
parallelStream() 获取并行流

2)中间操作

在流的传输过程中,对Stream流进行处理

查询

方法 描述
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素

筛选与切片

方法 描述
distinct() 筛选,通过流所生成的元素的hashCode()和equals()去除重复的元素(要去重的实体类需要重写hashCode和equals方法)
limit(long maxSize) 截断流,使其元素不超过给定数量
filter(Predicate p) 接收Lambda,从流中排除掉某些元素
skip(long n) 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补

映射

方法 描述
map(Function f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
mapToInt(ToIntFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream
mapToLong(ToLongFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream
mapToDouble(ToDoubleFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream
flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连成一个流

排序

方法 描述
sorted() 产生一个新流,其中按自然顺序排序
sorted(Comparator comp) 产生一个新流,其中按比较器顺序排序

comparable:自然排序

3)终止操作(终端操作)

终止操作返回的是一个结果,就是所有中间操作做完之后进行的操作,比如汇总、遍历输出、求和等等

Stream操作案例

  这里只是有选择性的做了几个案例,其实只要知道上面的“三步曲”,然后再知道点Lambda表达式,就能够进行Stream流式编程了。

1)筛选与切片

List
books = Arrays.asList( new Book("三国演义", 20, "罗贯中"), new Book("西游记", 25, "吴承恩"), new Book("水浒传", 30, "施耐庵"), new Book("红楼梦", 35, "曹雪芹") ); /** * 筛选出price大于等于30的书籍 */ @Test void test1() {
//获取流 Stream
bookStream = books.stream() //中间操作 .filter((book -> book.getPrice() >= 30)); //终止操作,遍历输出 bookStream.forEach(System.out::println); }/** 结果: * Book{name='水浒传', price=30, author='施耐庵'} * Book{name='红楼梦', price=35, author='曹雪芹'} */

2)排序

/**   * 排序   * List
books = Arrays.asList( * new Book("水浒传", 30, "施耐庵"), * new Book("西游记", 25, "吴承恩"), * new Book("三国演义", 20, "罗贯中"), * new Book("红楼梦", 35, "曹雪芹") * ); */ @Test void test7() {
books.stream().sorted((b1, b2) -> {
if (b1.getPrice().equals(b2.getPrice())) {
return b1.getName().compareTo(b2.getName()); } else {
return b1.getPrice().compareTo(b2.getPrice()); } }).forEach(System.out::println); }/** * Book{name='三国演义', price=20, author='罗贯中'} * Book{name='西游记', price=25, author='吴承恩'} * Book{name='水浒传', price=30, author='施耐庵'} * Book{name='红楼梦', price=35, author='曹雪芹'} */

3)匹配

/**   * 匹配   *  allMatch() :是否全部匹配,返回boolean   *  anyMatch() :任意一个是否匹配,返回boolean   */  @Test  void test8() {
System.out.println(books.stream().allMatch(book -> {
if (book.getPrice().equals(25)) {
return true; } return false; })); }

4)map映射

/**   * map 映射 获取 所有book对象中最高的price   */  @Test  void test9() {
Optional
max = books.stream() .map(Book::getPrice) .max(Integer::compareTo); System.out.println("books中price最高为:" + max.get()); } /** *books中price最高为:30 */

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

你可能感兴趣的文章
卓越领导看过程
查看>>
领导力与各种循环挑战
查看>>
达成谈判协议 - 避免操之过急
查看>>
销售人说话“十大忌”
查看>>
营销中的“战略非对称”
查看>>
android 如何开关Mediatek开发的Feature
查看>>
Android电话功能各部分深入探讨
查看>>
Android应用技巧总结
查看>>
Android创建sdcard详细图解
查看>>
Android开发:如何实现TCP和UDP传输
查看>>
Android电源管理相关应用技巧分享
查看>>
Android录音失真具体解决方案
查看>>
Android根文件系统相关应用介绍
查看>>
Android文件系统深入剖析
查看>>
Android判断网络状态方法详解
查看>>
在Android上实现Junit单元测试的四部曲
查看>>
有效控制Android应用程序的耗电量
查看>>
Android术语列表概览
查看>>
全方位解读Android多媒体框架源码
查看>>
Android音乐编程的管理音频硬件
查看>>