java基础之java8新特性:Stream API

引言:

Stream 是Java8 中新增的处理集合的概念,可以执行查找、过滤和映射数据等操作。Stream API 提供了一种高效且易于使用的处理集合数据的方式,方便对集合数据进行各种处理。

Stream 的特点:

Stream,简称“流”,不会存储元素,不会改变源对象,返回一个Stream的结果,Stream 操作是lazy的,会等到需要结果的时候才执行。

Stream API 的说明:

Stream的生命周期如下所示:

java基础之java8新特性:Stream API


生命周期

分为Stream对象创建,Stream数据中间操作,Stream结果操作三类。


一,Stream 创建的方式

使用集合类的stream方法创建Stream对象:

List<string> list = new ArrayList<>();/<string>

Stream<string> stream = list.stream();/<string>

使用Stream类的静态方法of()创建Stream对象:

Stream<string> stream = Stream.of("111","222","3333");/<string>

使用数组创建Stream对象:

String[] strs = new String[10];

Stream< String > stream = Arrays.stream(strs);

使用Stream类的迭代方法iterate创建Stream对象:

方法格式:

iterate(T seed, UnaryOperator f)

seed是种子,整个iterate的返回结果的元素是无限的,其序列如下所示:

seed,f(seed),f(f(seed))...以此类推。

举个栗子:

Stream<integer> stream = Stream.iterate(1, (x) -> x * 2);/<integer>

得到的stream内容为:1,2,4,8,16.....。

使用Stream类的生成generator创建Stream对象:

方法格式:

generate(Supplier s)

Supplier是一个函数接口,只封装了一个get()方法,就是说可以获取任意值。一般用于随机数。

举个栗子:

Stream<double> stream = Stream.generate(()-> java.lang.Math.random());/<double>

得到是stream为无限的随机数。


二,Stream数据中间操作

filter:筛选函数:

接收lambda,返回值需要为boolean的类型。

举个栗子:

Stream.of(1, 2, 3, 4, 5).filter(item -> item > 2).forEach(System.out::println);

打印结果:3,4,5

limit:截断函数:

使元素个数不超过规定的数量。

举个栗子:

Stream.of(1, 2, 3, 4, 5). limit(2).forEach(System.out::println);

打印结果:1,2

skip:跳过函数:

返回一个去掉前n个元素的流,若不足n个元素,则返回空流,超过n个,返回n之后的所有元素的流。

举个栗子:

Stream.of(1, 2, 3, 4, 5). skip(3).forEach(System.out::println);

打印结果:4,5

distinct:去重函数:

通过元素的hashCode()和equals()去除重复元素,对象必须重写过hashCode方法和equals方法。

举个栗子:

Stream.of(1, 2, 2, 4, 5). distinct.forEach(System.out::println);

打印结果:1,2,4,5

map:转换函数:

Stream中包含的元素使用给定的转换函数进行转换,保留转换后的结果组成的流。

举个栗子:

Stream.of("a", "b", "c").map((str)-> str.toUpperCase())

.forEach(System.out::println);

打印结果:A,B,C

sorted:排序函数:

sorted() :按照Comparable(内比较器,compareTo实现比较)来排序

sorted(Comparator com) :按照Comparatot(外比较器,compare实现比较)来排序。

举个栗子:

List<integer> list = Arrays.asList(2,3,1,4);/<integer>

list.stream().sorted().forEach(System.out::print);

打印结果:1,2,3,4

List<integer> list = Arrays.asList(2,3,1,4);/<integer>

list.stream().sorted((a, b) -> {

return (-1) * a.compareTo(b);

}).forEach(System.out::println);

打印结果:4,3,2,1


三,Stream结果操作

allMatch :是否所有元素都匹配

anyMatch:是否至少匹配到一个元素

以上返回boolean类型,true或false。

举个栗子

boolean allMatch = Stream.of(1, 2, 3, 4,5)

.allMatch((integer) -> integer < 5);

System.out.println(allMatch);

// 打印结果:false

boolean anyMatch = Stream.of(1, 2, 3, 4,5)

.allMatch((integer) -> integer < 5);

System.out.println(anyMatch);

// 打印结果:true

findFirst:返回第一个元素

findAny:返回当前流中任意元素

以上两个方法返回流中的元素的Optional实例。

Optional<integer> first = Stream.of(1,2,3,4,5).findFirst();/<integer>

Optional<integer> any = Stream.of(1,2,3,4,5). findAny();/<integer>

reduce(T identity,BinaryOperator):根据模型,从元素中计算得到一个值

实际使用中,可以用Lambada表达式或使用自定义的BinaryOperator实现方法扩展该功能,计算是迭代计算的。

如下所示:

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

Integer sum = list.stream()

.reduce(0,(x,y) -> x+y);

System.out.println(sum);

得到结果:15(0+1+2+3+4+5得到)

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

Integer sum = list.stream()

.reduce(Integer::sum);

System.out.println(sum);

得到结果:15(0+1+2+3+4+5得到)

//在Integer的源码中:

public static int sum(int a, int b) {

return a + b;

}

collect:将流转换一个Collector接口的实现,该实现可以自己定制。

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

List<integer> stringList =list.stream().collect(Collectors.toList());/<integer>

stringList.forEach(System.out::println);

打印结果:1,2,3,4,5

以上是今天Stream API 的学习主要内容,

其中collect和reduce功能非常强大,可自己定制想要的效果,篇幅关系不在详细描述,感兴趣的小伙伴自行找资料看看。



分享到:


相關文章: