谈起Java Stream API,我们希望能够弄明白它究竟是什么,能够用来做什么,有什么优势,并能够应用于具体场景。分别简述如下。
不是什么
- Java Stream API 不是输入输出流,与java.io包里的InputStream和OutputStream概念完全不同
- 不是用于解析XML的XMLStream
- 不是Valve公司的游戏平台
- 也不是集合元素,不是数据结构不保存数据
是什么
- 是Java 8 中引入的新特性,是对集合(Collection)对象功能的增强
- 是关于算法和计算的,更像一个高级版本的迭代器(Iterator)
能够用来做什么
用于对集合对象进行各种便利、高效的聚合操作,或大批量数据操作
有何优势
以往对于集合的聚合操作,需要使用Iterator遍历集合,代码繁冗;对于过滤和计算得到的中间结果,需要额外的空间进行存储
Java Stream API解决了以上问题,遍历逻辑可以精简为一行,使得代码更加简洁易读。
Java Stream提供串行和并行两种模式进行汇聚操作,能够充分利用多核处理器的优势,更方便写出高性能的并发程序且不易出错
典型应用场景
StreamAPIDemo
定义商品对象并初始化购物清单如下:
public class StreamAPIDemo { private List<Item> shoppingList; @Before public void setUp() throws Exception { shoppingList = Lists.newArrayList(); shoppingList.add(new Item("iPhone 7", 7250L)); shoppingList.add(new Item("Rolex Watch", 28888L)); shoppingList.add(new Item("Electric Toothbrush", 388L)); shoppingList.add(new Item("Kindle Paperwhite", 1098L)); shoppingList.add(new Item("Coca Cola", 3L)); } class Item { String itemName; long price; public Item(String itemName, long price) { this.itemName = itemName; this.price = price; } } }
集合遍历
// 打印购物清单 @Test public void printShoppingList(){ shoppingList.stream().forEach(System.out::println); }
输出:
Item{itemName='iPhone 7', price=7250} Item{itemName='Rolex Watch', price=28888} Item{itemName='Electric Toothbrush', price=388} Item{itemName='Kindle Paperwhite', price=1098} Item{itemName='Coca Cola', price=3}
数学统计
// 统计购物清单总数与总价 @Test public void printTotalPrice() { long itemNum = shoppingList.stream().count(); System.out.println("Sum of items in the shopping list: " + itemNum); long totalPrice = shoppingList.stream().collect(Collectors.summingLong(Item::getPrice)); System.out.println("Total price: " + totalPrice); }
输出:
Sum of items in the shopping list: 5 Total price: 37627
过滤与排序
// 过滤价格小于1000的商品 @Test public void filterItems(){ shoppingList.stream().filter(p -> p.getPrice() >= 1000L).forEach(System.out::println); } // 按价格排序 @Test public void sortItemsByPrice(){ shoppingList.stream().sorted(Comparator.comparingLong(Item::getPrice)).forEach(System.out::println); }
MapReduce(映射与规约)
// 所有商品价格减100 - Map @Test public void streamMap(){ shoppingList.stream().map(p -> new Item(p.getItemName(), p.getPrice()-100)).forEach(System.out::println); }
// 取出如上优惠之后金额超过1000元的商品中,价格最低的商品(最便宜的奢侈品) @Test public void streamReduce(){ Item cheapestLuxury = shoppingList.stream().map(p -> new Item(p.getItemName(), p.getPrice()-100)) .filter(p -> p.getPrice() > 1000).reduce((a, b) -> a.getPrice()<b.getPrice()?a:b).get(); System.out.println(cheapestLuxury); }
参考
相关推荐
基于java8,方便,快捷的Stream API常见使用场景实战
java 8实战 lambda表达式,Stream API,函数式编程,Optional,时间API
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
Java 8 已经出来了两年的时间,很多公司在日常开发中已经全面使用Java 8带来的编程革新,本课程从细节一点一滴的介绍Java 8的变化和详细API的深入讲解,大纲大致如下所示
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...
java8流源码Java8特性 实现 Java8 特性。 理解 lambdas - Lambdas 是存在于隔离中的函数。 Lambda 表现为匹配接口的实例。 . 使用 lambdas 。 函数式接口 - 接口是 Lambda 的类型,具有单一抽象方法的接口称为函数式...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...
java新特性介绍,包括:函数式编程,lambda表达式,stream流处理api,模块化技术(module system),响应式编程,本地变量类型推断; 下一代java技术演进
简单地说,Java 8中的新增功能是自Java 1.0发布18年以来,Java发生的最大变化。没有去掉 任何东西,因此你现有的Java代码都能工作,但新功能提供了强大的新语汇和新设计模式,能帮 助你编写更清楚、更简洁的代码。就...
java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在此处购买抢先体验: 我们非常渴望听到您的反馈并根据您的评论改进本书! 所有示例的源...