数据准备

```java public class Author { private Long id; private String name; private Integer age; private String intro; private List books; }

public class Book { private Long id; private String name; private String category; // "哲学,爱情,个人成长,个人传记" private Integer score; private String intro; } ```

```java private static List getAuthors() { //数据初始化 Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null); Author author2 = new Author(2L,"亚拉索",15,"狂风也追逐不上他的思考速度",null); Author author3 = new Author(3L,"易",14,"是这个世界在限制他的思维",null); Author author4 = new Author(3L,"易",14,"是这个世界在限制他的思维",null);

//书籍列表List<Book> books1 = new ArrayList<>();List<Book> books2 = new ArrayList<>();List<Book> books3 = new ArrayList<>();books1.add(new Book(1L,"刀的两侧是光明与黑暗","哲学,爱情",88,"用一把刀划分了爱恨"));books1.add(new Book(2L,"一个人不能死在同一把刀下","个人成长,爱情",99,"讲述如何从失败中明悟真理"));books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));books2.add(new Book(4L,"吹或不吹","爱情,个人传记",56,"一个哲学家的恋爱观注定很难把他所在的时代理解"));books3.add(new Book(5L,"你的剑就是我的剑","爱情",56,"无法想象一个武者能对他的伴侣这么的宽容"));books3.add(new Book(6L,"风与剑","个人传记",100,"两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?"));books3.add(new Book(6L,"风与剑","个人传记",100,"两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?"));author.setBooks(books1);author2.setBooks(books2);author3.setBooks(books3);author4.setBooks(books3);List<Author> authorList = new ArrayList<>(Arrays.asList(author,author2,author3,author4));return authorList;
}

```

创建流

  • 单列集合:集合对象.stream()

  • 数组:Arrays.stream(数组)

  • 双列集合:转换成单列集合后再创建

    ```java Map map = new HashMap<>(); map.put("张三",17); map.put("向阳",16);

    Stream > stream = map.entrySet().stream(); ```

中间操作

map

java // 打印所有作家名字 List<Author> authors = getAuthors(); authors.stream().map(s -> s.getName()).forEach(s -> System.out.println(s));

sort()

java // 对年龄进行降序, 版本一 List<Author> authors = getAuthors(); authors.stream() .sorted() // 空参的sorted()方法,需要流中的元素是实现了Comparable .forEach(author -> System.out.println(author.getAge()));

java // 对年龄进行降序, 版本二 authors.stream() .sorted((o1, o2) -> o2.getAge()-o1.getAge()) .forEach(author -> System.out.println(author.getAge()));

flatMap

java // 打印出书的类别 List<Author> authors = getAuthors(); authors.stream() .flatMap(author -> author.getBooks().stream()) .distinct() .flatMap(book -> Arrays.stream(book.getCategory().split(","))) .distinct() .forEach(category-> System.out.println(category));

终结操作

forEach
count

java // 打印所有作家的书籍数量 long count = authors.stream() .flatMap(s -> s.getBooks().stream()) .distinct() .count(); System.out.println(count);

max、min

java Optional<Book> maxScoreBook = authors.stream() .flatMap(s -> s.getBooks().stream()) .max((book1, book2) -> book1.getScore() - book2.getScore());

collect

获取Map集合,map中key为作者名,value为List<Book>

```java // 简洁版 Map > authorList = authors.stream() .distinct() .collect(Collectors.toMap(Author::getName, Author::getBooks));

// 详细版 Map > list = authors.stream() .distinct() .collect(Collectors.toMap( new Function () { @Override public String apply(Author author) { return author.getName(); } }, new Function >() { @Override public List apply(Author author) { return author.getBooks(); } } )); ```

anyMatch

是否有一个符合条件的元素,有一个满足则为true,否则为false

java // 判断是否有年龄在29以上的作家 List<Author> authors = getAuthors(); boolean flag = authors.stream()

allMatch

所有元素是否都符合指定条件,都符合为true,否则为false

java // 判断是否所有的作家都是成年人 List<Author> authors = getAuthors(); boolean flag = authors.stream() .allMatch(author -> author.getAge() >= 18); System.out.println(flag);

noneMatch

所有元素是否都不符合指定条件,都不符合结果为true,否则为false

java // 判断作家是否都没有超过100岁的。 List<Author> authors = getAuthors(); boolean flag = authors.stream() .noneMatch(author -> author.getAge() > 100);

findFirst

java // 获取年龄最小的作家,并输出他的名字 List<Author> authors = getAuthors(); Optional<Author> first = authors.stream() .sorted((o1, o2) -> o1.getAge() - o2.getAge()) .findFirst(); first.ifPresent(author -> System.out.println(author.getName()));

reduce

将流中的元素按指定规则计算出一个结果,一个参数的内部计算过程(还有两个参数、三个参数的重载方法):

java boolean foundAny = false; T result = null; // result返回结果 for (T element : this stream) { if (!foundAny) { foundAny = true; result = element; // 将第一个元素赋值给result,进行初始化 } else result = accumulator.apply(result, element); // 自己定义的计算规则 } return foundAny ? Optional.of(result) : Optional.empty();

example:求所有作家中年龄的最大值

java Optional<Integer> res = authors.stream() .map(Author::getAge) // (result, element)整体作为一个参数 .reduce((result, element) -> element > result ? element : result); // result:返回结果,element:流中的每个元素,初始化时流中第一个元素赋值给result,后面元素按照指定规则计算后赋值给result

Stream快速入门相关推荐

  1. 【Java】流(Stream)快速入门

    本文是面向Java初学者的流(Stream)学习指导教程.文章内容偏向怎么用,而弱化其诞生背景.流的概念.内部原理等说明解释性的语段. 主要内容: Optional 创建流 操作流 收集流 目录 什么 ...

  2. java8 stream 教程_java8 Stream 流快速入门

    Stream 流 简介 Java 8 中,得益于 lambda 带来的函数式编程,引入了一个全新的 Stream流 概念,用于解决集合已有的弊端. 好处 我们先来看一个例子: 筛选出 names 中以 ...

  3. Arduino Yun快速入门教程(大学霸内部资料)

    Arduino Yun快速入门教程(大学霸内部资料) 本资料为国内第一本Arduino Yun教程.详细讲解Arduino Yun的基本结构.开发环境.系统配置,并着力讲解关键功能--Bridge.最 ...

  4. 带你快速入门AXI4总线--AXI4-Stream篇(1)----AXI4-Stream总线

    写在前面 随着对XILINX器件使用的深入,发现越来越多的IP都选配了AXI4的接口.这使得只要学会了AXI4总线的使用,基本上就能对XILINX IP的使用做到简单的上手.所以学会AXI4总线,对X ...

  5. JSON数据结构(A、快速入门篇)(Yanlz+Data+JsonArray+JsonObject+JsonValue+JsonMapper.ToJson+JsonMapper.ToObject+)

    <JSON数据结构> 版本 作者 参与者 完成日期 备注 Data_JSON_V01_1.0 严立钻 2018.08.24 ++++一个好用的JSON在线编辑:http://www.kjs ...

  6. 架构设计:系统间通信(36)——Apache Camel快速入门(上)

    1.本专题主旨 1-1.关于技术组件 在这个专题中,我们介绍了相当数量技术组件:Flume.Kafka.ActiveMQ.Rabbitmq.Zookeeper.Thrift .Netty.DUBBO等 ...

  7. 高性价比WIFI图传方案快速入门教程

    ESP32-CAM ArduinoIDE开发系列文章目录 第一篇:ESP32-CAM高性价比WIFI图传方案快速入门教程 文章目录 ESP32-CAM ArduinoIDE开发系列文章目录 前言 一. ...

  8. 算法基础、算法比赛快速入门(java)

    想用Java快速入门算法?这篇文章你得看! 提示:本文章适合想要入门算法,并且想 "快速" 达到一定成果的同学们阅读~ 文章非常非常非常长(可能是你见过最长的算法基础篇章)!!! ...

  9. 网关是什么,一文带你快速入门腾讯技术工程

    今天来开门见山地讲讲网关是一个怎么样的组件,网关在做什么事情.网关这个词其实到处都在用,它可以工作在硬件层面,也可以工作在网络层,还可以工作在应用层. 网关快速入门 网关在做什么? 我们今天讲的实际上 ...

最新文章

  1. 学计算机方面该怎样保养眼睛,电脑工作者如何保护眼睛?吃什么对眼睛好
  2. Winform中实现ZedGraph滚轮缩放后自动重新加载数据
  3. C++练习 | C++中Vector的使用
  4. GoogleAppEngine是什么?
  5. python在线翻译脚本_用python实现百度翻译的示例代码
  6. iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码
  7. 4个步骤教你建立中后台后台通用权限管理系统
  8. 想多赚钱!程序员如何把副业搞得风生水起?
  9. Idea中使用maven 与pom文件讲解
  10. Queues.drain 一边读数据一边写数据
  11. 争议带货达人董明珠:直播带货476亿 却被质疑经销商刷单
  12. 【esxi跑网心云(cdn)软路由拨号】esxi服务器使用ikuai虚拟机拨号并配置家庭路由器上网
  13. 1-15 Burpsuite Sequencer介绍
  14. 有关阿里云ECS访问端口和加入安全组的说明
  15. 苹果听天由命 未雇佣游说公司处理欧盟补税案
  16. 密码技术学习(1)-初识密码
  17. 大数据运维工程师面试题目
  18. java强制转换用法_Java入门课|这才是Java强制类型转换的正确使用方法,你真的会用这些吗...
  19. 软件开发与过程管理——需求定义
  20. cad==sketchup

热门文章

  1. OracleParameter类介绍
  2. JavaScript 选购图书功能——选购、退购、清空、结账
  3. Linq to SQL八大子句
  4. java中如何表示负数?
  5. js点击小眼睛显示隐藏密码框的密码
  6. cas20205-29-2|2,3,3-三甲基-1-丙基-3H-吲哚碘|2,3,3-trimethyl-1-propylindol-1-ium,iodide齐岳生物
  7. 微压压力传感器的灵敏度和线性度
  8. 4、StyleGAN系列
  9. MVC3学习第十五章 武林外传大结局
  10. 【修真院web小课堂】angular js常用指令 ng-blur、ng-change、ng-focus、ng-disabled是如何运用到表单验证中的?