所在的位置: java >> 历史起源 >> LearningJava8Strea

LearningJava8Strea

全文目录:

引言

创建流

常用的流操作

filter

map

flatMap

有状态的转换

distinct

sorted

Optional类型

聚合操作

count

max/min

findFirst/findAny

anyMatch/allMatch/noneMatch

reduce

收集操作(collect)

转换成集合

转换成值

分区操作(partitioningBy)

分组操作(groupingBy)

基本类型流(IntStream,LongStream,DoubleStream)

在文件操作中使用流

引言

先从一个例子开始,看看为什么在Java8中要引入流(Stream)?

比如实现这么一个需求:在学生集合中查找男生的数量。

传统的写法为:

publiclonggetCountsOfMaleStudent(ListStudentstudents){longcount=0;for(Studentstudent:students){if(student.isMale()){count++;}}returncount;}

看似没什么问题,因为我们写过太多类似的”样板”代码,尽管智能的IDE通过codetemplate功能让这一枯燥过程变得简化,但终究不能改变冗余代码的本质。

再看看使用流的写法:

publiclonggetCountsOfMaleStudent(ListStudentstudents){returnstudents.stream().filter(Student::isMale).count();}

一行代码就把问题解决了!

虽然读者可能还不太熟悉流的语法特性,但这正是函数式编程思想的体现:

回归问题本质,按照心智模型思考问题。

延迟加载。

简化代码。

下面正式进入流的介绍。

创建流

创建流的方式可以有很多种,其中最常见的方式是通过Collection的Stream()方法或者Arrays的Stream()方法来生成流。

比如:

ListIntegernumbers=Arrays.asList(1,2,3);StreamIntegernumberStream=numbers.stream();String[]words=newString[]{"one","two"};StreamStringwordsStream=Arrays.stream(words);

当然Stream接口本身也提供了许多和流相关的操作。

//创建流StreamIntegernumbers=Stream.of(1,2,3);//创建空流StreamStringemptyStream=Stream.empty();//创建一个元素为“hi”的无限流StreamStringinfiniteString=Stream.generate(()-"hi");//创建一个从0开始的递增无限流StreamBigIntegerintegers=Stream.iterate(BigInteger.ZERO,n-n.add(BigInteger.ONE));

其中Stream.generate()和Stream.iterate()产生的都是无限流,如果要把他们截取为有限流,可以使用limit()方法,比如:

StreamDoubletop10=Stream.generate(Math::random).limit(10);

另外,可以通过skip()方法跳过元素,concat()方法连接两个流。

StreamIntegerskipedStream=Stream.of(1,2,3,4).skip(2);//3,4StreamStringconcatedStream=Stream.concat(Stream.of("hello"),Stream.of(",world"));//hello,world常用的流操作filter

filter()方法的作用就是根据输入的条件表达式过滤元素。

接口定义如下:

StreamTfilter(Predicate?superTpredicate);

从中可以看出,输入参数是一个Predicate,也即是一个条件表达式。

一个例子:

Stream.of("a","1b","c","0x").filter(value-isDigit(value.charAt(0)));

过滤出第一个字符是数字的元素。

输出结果为:

1b,0x

map

map()的主要作用是通过映射函数转换成新的数据。

接口定义如下:

RStreamRmap(Function?superT,?extendsRmapper);

从中可以看出,输入参数是一个Function。

一个例子:

Stream.of("a","b","c").map(String::toUpperCase);

把字符串转换成大写。

输出结果:

A,B,C

flatMap

flatMap()的作用类似于map(),但它通过Function返回的依然是一个Stream,也即是把多个Stream转换成一个扁平的Stream。

接口定义如下:

RStreamRflatMap(Function?superT,?extendsStream?extendsRmapper);

一个例子:

StreamListIntegerlistStream=Stream.of(asList(1,2),asList(3,4));StreamIntegerintegerStream=listStream.flatMap(numbers-numbers.stream());

它把两个list组成的Stream转成一个包含全部元素的Stream。

输出:

[1,2,3,4]

有状态的转换

在前面介绍的函数中,无论是map还是filter,都不会改变流的状态,也即结果并不依赖之前的元素。

除此之外,Java8也提供了有状态的转换,常用的操作是distinct和sorted。

distinct

distinct()的主要作用是去除流中的重复元素。和Oracle的distinct一个作用。

举例如下:

StreamStringdistinctStream=Stream.of("one","one","two","three").distinct();

去除字符串中的重复元素,返回结果为:

one,two,three

sorted

sorted()的主要作用是对流按照指定的条件进行排序。

接口定义如下:

StreamTsorted(Comparator?superT







































白癜风早期能根治吗
北京白癜风的治疗



转载请注明:http://www.jiaju1314.com/lsqy/1365.html

  • 上一篇文章:
  •   
  • 下一篇文章: