• 前言

上篇文章已经为大家简单的介绍了stream流API的常用操作,如果你只是看一看,没有动手敲一敲代码的话,那么我还是建议你动手敲代码,说一千,道一万,不如自己动手干一干,只有动起手来,你才能体会到stream的酣畅淋漓。好了,废话不多说,我们来看一看Stream API。

  • Stream api 类图



stream流求某个字段 bigdem_User

Stream 类图



从这个类图可以看到,BaseStream 是最基础的接口,它提供了所有流都可以使用的最基本的功能;而AutoCloseable主要是简化了关闭资源的操作,接口里面只有一个close() 方法。现在我们就主要看BaseStream这个接口。

  • BaseStream接口



stream流求某个字段 bigdem_stream流常用方法_02

BaseStream方法



public interface BaseStream>        extends AutoCloseable {//具体方法见上图 }

从这个接口的定义可以看到,BaseStream是一个泛型接口,它有两个类型参数T和S, 其中T是流中的元素的类型,并且由>可以知道S必须为BaseStream或BaseStream子类。

  • BaseStream接口方法说明
Iterator iterator(); //获取流的迭代器,并返回其引用(终端操作)Spliterator spliterator();//获取流的Spliterator,并返回引用(终端操作)boolean isParallel();//判断是否是一个并行流,是则返回true,否返回falseS sequential();//基于调用流,返回一个顺序流。如果调用流已经是顺序流了,就返回该流。(中间操作)S parallel();//基于调用流,返回一个并行流。如果调用流已经是并行流了,就返回该流。(中间操作)S unordered();//基于调用流,返回一个无序流。如果调用流已经是无序流了,就返回该流。(中间操作)S onClose(Runnable closeHandler);//返回一个可以指定关闭程序的流(中间操作)void close();//继承来自AutoCloseable的
  • 什么是流的终端操作和中间操作
  1. 终端操作:消费流并产生一个结果
  2. 中间操作:中间操作会产生另一个流。因此中间操作可以用来创建执行下一步动作的管道。
  • 流的哪些操作是中间操作和终端操作呢

我们先看下Stream的方法,简直不要太多,不过大都是大同小异的,比如mapToInt,mapToLong这些,理解了其中一个,其他的举一反三,也自然明白了。




stream流求某个字段 bigdem_User_03


stream流求某个字段 bigdem_stream流常用方法_04

Stream的方法


好了,这么多方法,如何区分终端与中间操作,用一张图来描述,感谢这位朋友的图;


stream流求某个字段 bigdem_stream流求某个字段 bigdem_05

流的中间操作与终端操作


下面就演示几个例子,还是建议刚接触stream的同学动手敲一敲。

  • show me the code
Stream.of(1,2,3,4,5,6)                .limit(3) //限制三个                .forEach(e->System.out.println(e)); //将输出 前三个 1,2,3Stream.of(1,2,3,1,2,5,6,7,8,0,0,1,2,3,1)                .filter(e->e>=5) //过滤小于5的                .forEach(e->System.out.println(e));
Stream.of("a-b-c-d","e-f-i-g-h")                .flatMap(e->Stream.of(e.split("-"))) //将元素重新组成流并将流合并成一条                .forEach(e->System.out.println(e));// a b c d e f i g h
User w = new User("w",10);User x = new User("x",11);User y = new User("y",12);Stream.of(w,x,y)    .peek(e->{e.setName(e.getAge()+e.getName());}) //重新设置名字 变成 年龄+名字  .forEach(e->System.out.println(e.toString()));
Stream.of(2,1,3,6,4,9,6,8,0)                .sorted()//自然排序                .forEach(e->System.out.println(e));User x = new User("x",11);User y = new User("y",12);User w = new User("w",10);Stream.of(w,x,y)  .sorted((e1,e2)->e1.age>e2.age?1:e1.age==e2.age?0:-1)  //自定义比较  .forEach(e->System.out.println(e.toString()));
Stream.of("apple", "banana", "orange", "waltermaleon", "grape")                .collect(Collectors.toSet()) //set 容器 ,去重                .forEach(e -> System.out.println(e));
int sum = Stream.of(0,9,8,4,5,6,-1)              .reduce(0,(e1,e2)->e1+e2);//归并,求合        System.out.println(sum); //31
  • 小结

今天主要是介绍了Stream的一些方法和一些概念