Java8中的Stream详解

程序员书单

共 4473字,需浏览 9分钟

 · 2021-09-07

java8已经发布相当长一段时间了,我工作中一直维护的几个项目发布在很多环境中,我也不敢保证每个环境的JDK都是1.8版本以上的,也就一直没在工作中使用java8的一些新特性


java8刚发布时我学习了一下,写了一些demo,没有及时的进行归档,现在这些demo基本都已经找不到了。在工作中每每遇到对集合进行一些操作时都很头疼,只能不停的对集合进行for循环,有时还需要对同一个集合循环两次以上,不仅效率不高,还浪费服务器资源,数据量大时还可能内存溢出


痛定思痛,我还是决定把学而又忘的java8的新特性进行重新的梳理和学习,本文主要讲如何利用stream对集合进行一系列的操作,包括排序、取最大值、过滤等


没有过多的文字描述,直接上代码。以下代码中的每个方法都可以单独拿出来运行,方便在实际工作中的快速使用

package com.helianxiaowu.java8;

import org.junit.Test;
import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;
/** * @title java8的集合stream操作详解 * @desc * @author helianxiaowu * @date 2020/2/1 23:20 */public class StreamDemo {
/** * 获取集合中的最大值或最小值 */ @Testpublic void testMaxAndMin(){ List<Integer> list = Arrays.asList(1, -1, 2, -2); Integer max = list.stream().max((i, j) -> Integer.compare(i, j)).get(); Integer min = list.stream().min((i, j) -> Integer.compare(i, j)).get(); System.out.printf("max=%s, min=%s", max, min); // max=2, min=-2 }
/** * 排序 */ @Testpublic void testSorted() { List<Integer> list = Arrays.asList(1, 4, 3, 2);
// 正序排序 List<Integer> sortedList1 = list.stream().sorted().collect(Collectors.toList()); System.out.printf("sortedList1=%s%n", sortedList1);// sortedList1=[1, 2, 3, 4]
// 倒序排序 List<Integer> sortedList2 = list.stream().sorted((i, j)-> Long.compare(j, i)).collect(Collectors.toList()); System.out.printf("sortedList2=%s", sortedList2);// sortedList2=[4, 3, 2, 1] }
/** * 使用map可以访问list中的元素的某些属性或方法 */ @Testpublic void testMap() { List<String> list = Arrays.asList("a", "java", "helianxiaowu");// 获取list中的字符串的长度 List<Integer> mapList = list.stream().map(String::length).collect(Collectors.toList()); System.out.printf("mapList=%s%n", mapList); // mapList=[1, 4, 12] }
/** * 滤重 */ @Testpublic void testDistinct() { List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3); List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());        System.out.printf("distinctList=%s", distinctList); // distinctList=[1, 2, 3] }
/** * limit可以取出集合中的前n个元素 */ @Testpublic void testLimit() { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);// 取出前3个元素 List<Integer> limitList = list.stream().limit(3).collect(Collectors.toList()); System.out.printf("limitList=%s", limitList); // limitList=[1, 2, 3] }
/** * skip可以去除list中的前n个元素,与limit相反作用 */ @Testpublic void testSkip() { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);// 去除list中的前3个元素 List<Integer> skipList = list.stream().skip(3).collect(Collectors.toList()); System.out.printf("skipList=%s", skipList); // skipList=[4, 5, 6] }
/** * 根据条件过滤集合中的元素 */ @Testpublic void testFilter() { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);// 过滤能被2整除的元素 List<Integer> filterList = list.stream().filter(i -> i%2==0).collect(Collectors.toList()); System.out.printf("filterList=%s", filterList); // filterList=[2, 4, 6] }
/** * 聚合 */ @Testpublic void testReduce() { List<Integer> list = Arrays.asList(1, 2, 3, 4);// 计算list中所有元素的乘积 Integer integer = list.stream().reduce((i, j) -> i * j).get(); System.out.printf("integer=%s", integer); // integer=24 }
/** * 匹配 * anyMatch 集合中的元素有一个满足条件就返回true * allMatch 集合中的元素全部满足条件返回true * noneMatch 集合中的元素都不满足条件返回true */ @Testpublic void testMatch() { List<Integer> list = Arrays.asList(1, 2, 3, 4);// list中有没有大于等于4的元素 boolean b1 = list.stream().anyMatch(i -> i >= 4); System.out.printf("b1=%s%n", b1);// b1=true
// list中的元素是否全部大于4 boolean b2 = list.stream().allMatch(i -> i > 4); System.out.printf("b2=%s%n", b2); // b2=false
// list中的元素是否没有大于4的 boolean b3 = list.stream().noneMatch(i -> i > 4); System.out.printf("b3=%s", b3);// b3=true
}}


stream使用起来如此方便,或许你会关心它的性能到底如何。可以参考相关的性能测试数据,结论是stream的性能无需担心

— 【 THE END 】—
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 PDF 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报