Java8 Stream中间操作实例解析

网友投稿 442 2022-12-19


Java8 Stream中间操作实例解析

这篇文章主要介绍了java8 Stream中间操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

介绍Stream

Stream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。

Stream两种操作

中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。

终端操作(Terminal Operations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。

中间操作方法分类:

filter()

map()

flatMap()

distinct()

sorted()

peek()

limit()

skip()

终端操作方法分类:

forEach()

forEachOrdered()

toArray()

reduce()

collect()

min()

max()

count()

anyMatch()

allMatch()

noneMatch()

findFirst()

findAny()

中间操作代码实例详解

1、filter(): 返回结果生成新的流中只包含满足筛选条件的数据。

// 1、filter,返回大于2的元素集合

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

List result = nums.stream().filter(n -> n > 2).collect(Collectors.toList());

System.out.println(result);

运行结果:[3, 4, 5]

2、map():将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。

// 2、map:返回元素的大写类型和哈希值

List mzc = Arrays.asList("ma", "zhi", "chu");

List mzcUpperCase = mzc.stream().

map(n -> n.toUpperCase()).

collect(Collectors.toList());

List mzcHashCode = mzc.stream().map(n -> n.hashCode()).collect(Collectors.toList());

System.out.println("mzcUpperCase:"+mzcUpperCase+" ----- mzcHashCode:"+mzcHashCode);

运行结果:

mzcUpperCase:[MA, ZHI, CHU] ----- mzcHashCode:[3476, 120571, 98480]

示例场景:取出商品的所有id,就可以这样写(伪代码):

List productList = productService.selectAll();

List pIds = productList.stream().map(p->p.getId).collect(Collectors.toList());

这样就可以拿到所有商品id的集合。

3、flatMap():扁平化映射,它具体的操作是将多个stream连接成一个stream,这个操作是针对类似多维数组的,比如集合里面包含集合,相当于降维作用。

flatMap是将流中的每个元素都放到一个流中,最后将所有的流合并成一个新流,所有流对象中的元素都合并到这个新生成的流中返回。

// flatMap:将多层集合中的元素取出来,放到一个新的集合中去

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

List num2 = Arrays.asList(4, 5, 6);

List num3 = Arrays.asList(7, 8, 9);

List> lists = Arrays.asList(num1, num2, num3);

Stream outputStream = lists.stream().flatMap(l -> l.stream());

List flatMapResult = outputStream.sorted().collect(Collectors.toList());

System.out.println(flatMapResult);

运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例场景:取出所有部门人员的姓名,就可以这样写(伪代码):

// 1、取出所有部门

List departments = ...;

// 2、这个时候可以利用flatMap先将所有部门的所有人员汇聚起来

List persons = departments.stream.flatMap(d->d.getPersonList()).collect(Collectors.toList());

// 3、再利用map()方法取出

4、distinct():顾名思义,将流中的元素去重之后输出。

List mzc = Stream.of("ma","zhi","chu","zhi","shuo","ma")

.distinct()

.collect(Collectors.toList());

System.out.println(mzc);

运行结果:[ma, zhi, chu, shuo]

5、sorted():这个很简单了,顾名思义,将流中的元素按照自然排序方式进行排序。

// sorted:自然顺序排序

List nums = Arrays.asList(1, 3, 5, 6, 8, 2);

List sortedNum = nums.stream().sorted().collect(Collectors.toList());

System.out.println(sortedNum);

// sorted:降序排序

List sortedNum2 = nums.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

System.out.println(sortedNum2);

// sorted:使用Comparator

List sortedNums3 = nums.stream().sorted(Comparator.comparing(n -> n)).collect(Collectors.toList());

System.out.println(sortedNums3);

// 不用stream直接顺序排序

nums.sort(Comparator.comparing(Integer::intValue));

System.out.println(nums);

//不用stream直接降序排序

nums.sort(Comparator.comparing(Integer::intValue).reversed()UeMXR);

System.out.println(nums);

运行结果:

[1, 2, 3, 5, 6, 8]

[8, 6, 5, 3, 2, 1]

[1, 2, 3, 5, 6, 8]

[1, 2, 3, 5, 6, 8]

[8, 6, 5, 3, 2, 1]

6、peek():对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。

// peek():

String[] arr = new String[]{"a","b","c","d"};

Arrays.stream(arr)

.peek(System.out::println) //a,b,c,d

.count();

// peek()+filter()

Stream.of("ma", "zhi", "chu")

.filter(e -> e.length() > 2)

.peek(e -> System.out.println(e))

.collect(Collectors.toList());

运行结果:

a

b

c

d

zhi

chu

7、limit():顾名思义,返回指定数量的元素的流。返回的是Stream里前面的n个元素。

// limit():取出100中的前十个

List limitNum = IntStream.range(1,100).limit(10)

.boxed()

.collect(Collectors.toList());

System.out.println(limitNum);

// limit():取出前4个单词

List words = Arrays.asList("ma", "zhi", "chu", "wait", "you", "follow");

List limitWord = words.stream().limit(4).collect(Collectors.toList());

System.out.println(limitWord);

运行结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[ma, zhi, chu, wait]

8、skip():和limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。

// skip():跳过前面三个单词再返回

List

List skipWord = words.stream().limit(4).collect(Collectors.toList());

System.out.println(skipWord);

// skip():跳过全部单词再返回

List emptyWord = words.stream().skip(6).collect(Collectors.toList());

System.out.println(emptyWord);

// skip():跳过超过单词长度的数目再返回

List emptyWord2 = words.stream().skip(10).collect(Collectors.toList());

System.out.println(emptyWord);

运行结果:

[91, 92, 93, 94, 95, 96, 97, 98, 99]

[ma, zhi, chu, wait]

[]

[]

List skipWord = words.stream().limit(4).collect(Collectors.toList());

System.out.println(skipWord);

// skip():跳过全部单词再返回

List emptyWord = words.stream().skip(6).collect(Collectors.toList());

System.out.println(emptyWord);

// skip():跳过超过单词长度的数目再返回

List emptyWord2 = words.stream().skip(10).collect(Collectors.toList());

System.out.println(emptyWord);

运行结果:

[91, 92, 93, 94, 95, 96, 97, 98, 99]

[ma, zhi, chu, wait]

[]

[]


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java生成二维码并且给二维码添加logo
下一篇:SpringSecurity框架下实现CSRF跨站攻击防御的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~