1、stream处理数据介绍
如果没有集合Collection
你如何处理数据?几乎所有的Java
应用程序都要使用Collection
处理数据。他们是十分重要的编程工作:例如,您可能想要创建银行交易的集合Collection
,这个集合代表客户的状态。然后,你可能要处理整个集合来找出的顾客花了多少钱。尽管集合如此重要,但是在Java中处理集合的技术还远远不够完善。
首先,对集合的典型处理模式是类似SQL操作,比如”finding
“(例如,找到具有最高价的交易)或”grouping
” (例如,将相关的杂物所有交易合并组) 。大多数数据库让您这样的声明方式指定的操作。例如,下面的SQL查询可以让您找到交易ID最高值: “SELECT id, MAX(value) from transactions
” 。
正如你所看到的,我们并不需要实现如何具体计算最大值(例如,使用循环和一个变量来跟踪的最高值) 。我们只能表达我们所期望的要求(获得最大值)。只要我们显式发出这样的查询,数据库就会为我们去处理。可是为什么我们不能在集合Collection
中实现类似的东西?多少次,你会发现自己使用循环一遍又一遍的反复遍历集合?(如:for Object o: myLists{ ..}
)
其次,如何才能有效地处理真正的大数据集合?在理想的情况下,你想利用多核架构加快处理,。然而,编写并行代码很难而且容易出错。
Java 8 API
的设计者重新提出了一个新的抽象称为流Stream
,可以让你以一种声明的方式处理数据。此外,数据流可以充分利用多核架构而无需编写多线程的一行代码。这听起来不错,不是吗?
首先,我们看看在Java 7
中,如何发现typegrocery
的所有交易,然后返回以交易值降序排序好的交易ID集合?
List<Transaction> groceryTransactions = new Arraylist<>(); for(Transaction t: transactions){ if(t.getType() == Transaction.GROCERY){ groceryTransactions.add(t); } } Collections.sort(groceryTransactions, new Comparator(){ public int compare(Transaction t1, Transaction t2){ return t2.getValue().compareTo(t1.getValue()); } }); List<Int<i style="color:transparent">本文来源gaodai$ma#com搞$代*码*网(</i>eger> transactionIds = new ArrayList<>(); for(Transaction t: groceryTransactions){ transactionsIds.add(t.getId()); }
而在Java 8使用Stream:
List<Integer> transactionsIds = transactions.stream() .filter(t -> t.getType() == Transaction.GROCERY) .sorted(comparing(Transaction::getValue).reversed()) .map(Transaction::getId) .collect(toList());
我们首先从交易数据列表中获得一个stream
对象,这是通过使用List
的stream()
方法实现的,下一步几个操作 (filter
, sorted
, map
, collect
)是以链式排列成一个管道,形成对数据的查询操作。