几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元
素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历
import ;">; import ;">; public class Demo01ForEach { public static void main ( String [] args ) { List <</span>String> list = new ArrayList<>(); list . add ( " 张无忌 " ); list . add ( " 周芷若 " ); list . add ( " 赵敏 " ); list . add ( " 张强 " ); list . add ( " 张三丰 " ); for ( String name : list ) { System . out . println ( name ); } }
正常情况下我们是如何遍历的呢(JDK1.8之前)?
import ;">; import ;">; public class Demo02NormalFilter { public static void main ( String [] args ) { List <</span>String> list = new ArrayList<>(); list . add ( " 张无忌 " ); list . add ( " 周芷若 " ); list . add ( " 赵敏 " ); list . add ( " 张强 " ); list . add ( " 张三丰 " ); List <</span>String> zhangList = new ArrayList<>(); for ( String name : list ) { if ( name . startsWith ( " 张 " )) { zhangList . add ( name ); } } List <</span>String> shortList = new ArrayList<>(); for ( String name : zhangList ) { if ( name . length () == 3 ) { shortList . add ( name ); } }
但是在JDK1.8之后,出现了Stream流,遍历的方式变得更加优雅了。
比如说还是这个例子
import ;">; public class Demo03StreamFilter { public static void main ( String [] args ) { List <</span>String> list = new ArrayList<>(); list . add ( " 张无忌 " ); list . add ( " 周芷若 " ); list . add ( " 赵敏 " ); list . add ( " 张强 " ); list . add ( " 张三丰 " ); list . stream () . filter ( s > s . startsWith ( " 张 " )) . filter ( s > s . length () == 3 ) . forEach ( System . out :: println ); } }
直接看代码就能知道, 获取流、过滤姓张、过滤长度为 3 、逐一打印 。代码很简洁,很直观。
stream流的特性如下
Stream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作。
这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。
Stream不保存数据,故每个Stream流只能使用一次。
stream流的方法有很多中,大致分为延迟方法和终结方法。
延迟方法 :返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方
法均为延迟方法。)
终结方法 :返回值类型不再是 Stream 接口自身类型的方法,因此不再支持类似 StringBuilder 那样的链式调
用。终结方法包括 count 和 forEach 方法。
forEach的使用:
public static void main(String[] args) { Stream <</span>String> stream = Stream.of("张无忌", "张三丰", "周芷若"); stream . forEach ( name > System . out . println ( name )); }
fifilter方法的使用
public static void main(String[] args) { Stream <</span>String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream <</span>String> result = original.filter(s > s.startsWith("张")); }
count方法的使用
public static void main(String[] args) { Stream <</span>String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream <</span>String> result = original.filter(s > s.startsWith("张")); System . out . println ( result . count ()); // 2 }
limit方法的使用
public static void main(String[] args) { Stream <</span>String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream <</span>String> result = original.limit(2); System . out . println ( result . count ()); // 2