首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java基础之java8新特性:Stream API

引言:

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

Stream 的特点:

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

Stream API 的说明:

Stream的生命周期如下所示:

生命周期

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

一,Stream 创建的方式

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

List list = new ArrayList();

Stream stream = list.stream();

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

Stream stream = Stream.of("111","222","3333");

使用数组创建Stream对象:

String[] strs = new String[10];

Stream stream = Arrays.stream(strs);

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

方法格式:

iterate(T seed, UnaryOperator f)

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

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

举个栗子:

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

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

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

方法格式:

generate(Supplier s)

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

举个栗子:

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

得到是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 list = Arrays.asList(2,3,1,4);

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

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

List list = Arrays.asList(2,3,1,4);

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

System.out.println(allMatch);

// 打印结果:false

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

.allMatch((integer) -> integer

System.out.println(anyMatch);

// 打印结果:true

findFirst:返回第一个元素findAny:返回当前流中任意元素

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

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

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

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

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

//在Integer的源码中:

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

return a + b;

}

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

List list = Arrays.asList(1,2,3,4,5);

List stringList =list.stream().collect(Collectors.toList());

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

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

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

其中collect和reduce功能非常强大,可自己定制想要的效果,篇幅关系不在详细描述。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200210A045CZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券