Java8 Stream常用API整理(值得收藏)
点击上方“Java专栏”,选择“置顶或者星标” 第一时间阅读精彩文章! 点击这段文字获取:5个可以写到简历的项目实战视频教程(含源码) 题 图:pexels 作 者:程铭程铭你快成名 来 源:https://blog.csdn.net/wangchengming1/article/details/89245402 Java8中有两大最为重要的改变,第一个是Lambda表达式,另外一个则是Stream API。 流是 Java8 引入的全新概念,它用来处理集合中的数据。 众所周知,集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像 SQL 语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。 在项目中使用 Stream API 可以大大提高效率以及代码的可读性,使我们对数据进行处理的时候事半功倍。 这篇博文以实战角度出发,讲解平时开发中常用 API 的用法以及一些注意的地方。 首先创建一个对象 publicclassEmployee{privateintid;privateString name;privateintage;privatedoublesalary;privateStatus status;publicenumStatus {FREE, BUSY, VOCATION;}publicEmployee(){}publicEmployee(String name){this.name = name;}publicEmployee(String name, intage){this.name = name;this.age = age;}publicEmployee(intid, String name, intage, doublesalary){this.id = id;this.name = name;this.age = age;this.salary = salary;}publicEmployee(intid, String name, intage, doublesalary, Status status){this.id = id;this.name = name;this.age = age;this.salary = salary;this.status = status;}//省略get,set等。。。} 随便初始化一些数据 List<Employee> empList = Arrays.asList(newEmployee(102, "李四", 59, 6666.66, Status.BUSY),newEmployee(101, "张三", 18, 9999.99, Status.FREE), newEmployee(103, "王五", 28, 3333.33, Status.VOCATION),newEmployee(104, "赵六", 8, 7777.77, Status.BUSY), newEmployee(104, "赵六", 8, 7777.77, Status.FREE),newEmployee(104, "赵六", 8, 7777.77, Status.FREE), newEmployee(105, "田七", 38, 5555.55, Status.BUSY)); 中间操作 根据条件筛选 filter /*** 接收Lambda, 从流中排除某些元素。*/@TestvoidtestFilter(){ empList.stream().filter((e) -> {returne.getSalary() >= 5000;}).forEach(System.out::println);} 跳过流的前n个元素 skip /*** 跳过元素,返回一个扔掉了前n个元素的流。*/@Testvoid testSkip() {empList.stream().filter((e) -> e.getSalary() >= 5000).skip(2).forEach(System.out::println);} 去除重复元素 distinct /*** 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素*/@Testvoid testDistinct() {empList.stream().distinct().forEach(System.out::println);} 截取流的前n个元素 limit /*** 截断流,使其元素不超过给定数量。*/@Testvoid testLimit() {empList.stream().filter((e) -> {returne.getSalary() >= 5000; }).limit(3).forEach(System.out::println);} 映射 map /*** 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素*/@Testvoid testMap() {empList.stream().map(e -> e.getName()).forEach(System.out::println);empList.stream().map(e -> {empList.forEach(i -> {i.setName(i.getName() + "111");});returne;}).collect(Collectors.toList());} 自然排序 sorted /*** 产生一个新流,其中按自然顺序排序*/@Testvoid testSorted() {empList.stream().map(Employee::getName).sorted().forEach(System.out::println);} 自定义排序 sorted(Comparator comp) /*** 产生一个新流,其中按自然顺序排序*/@Testvoid testSortedComparator() {empList.stream().sorted((x, y) -> {if(x.getAge() == y.getAge()) {returnx.getName().compareTo(y.getName()); } else{returnInteger.compare(x.getAge(), y.getAge());}}).forEach(System.out::println);} 最终操作 是否匹配任一元素 anyMatch /*** 检查是否至少匹配一个元素*/@TestvoidtestAnyMatch() {boolean b = empList.stream().anyMatch((e) -> e.getStatus().equals(Status.BUSY));System.out.println("boolean is : "+ b);} 是否匹配所有元素 allMatch /*** 检查是否匹配所有元素*/@TestvoidtestAllMatch() {boolean b = empList.stream().allMatch((e) -> e.getStatus().equals(Status.BUSY));System.out.println("boolean is : "+ b);} 是否未匹配所有元素 noneMatch /*** 检查是否没有匹配的元素*/@TestvoidtestNoneMatch() {boolean b = empList.stream().noneMatch((e) -> e.getStatus().equals(Status.BUSY));System.out.println("boolean is : "+ b);} 返回第一个元素 findFirst /*** 返回第一个元素*/@TestvoidtestFindFirst() {Optional<Employee> op = empList.stream().sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())).findFirst();if(op.isPresent()) {System.out.println("first employee name is : "+ op.get().getName().toString());}} 返回流中任意元素 findAny /*** 返回当前流中的任意元素*/@TestvoidtestFindAny() {Optional<Employee> op = empList.stream().sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())).findAny();if(op.isPresent()) {System.out.println("any employee name is : "+ op.get().getName().toString());}} 返回流的总数 count /*** 返回流中元素的总个数*/@TestvoidtestCount() {longcount = empList.stream().filter((e) -> e.getStatus().equals(Status.FREE)).count();System.out.println("Count is : "+ count);} 返回流中的最大值 max /*** 返回流中最大值*/@TestvoidtestMax(){Optional<Double> op = empList.stream().map(Employee::getSalary).max(Double::compare);System.out.println(op.get());} 返回流中的最小值 min /*** 返回流中最小值*/@TestvoidtestMin() {Optional<Employee> op2 = empList.stream().min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));System.out.println(op2.get());} 归约 reduce归约是将集合中的所有元素经过指定运算,折叠成一个元素输出 /*** 可以将流中元素反复结合起来,得到一个值。返回T*/@TestvoidtestReduce(){Optional<Double> op = empList.stream().map(Employee::getSalary).reduce(Double::sum);System.out.println(op.get());}/*** 可以将流中元素反复结合起来,得到一个值,返回Optional< T>*/@TestvoidtestReduce1(){Optional<Integer> sum = empList.stream().map(Employee::getName).flatMap(Java8Stream::filterCharacter).map((ch) -> {if(ch.equals('六'))return1;elsereturn0;}).reduce(Integer::sum);System.out.println(sum.get());} 将元素收集到 list 里 Collectors.toList() /*** 把流中的元素收集到list里。*/@Testvoid testCollectorsToList() {List<String> list= empList.stream().map(Employee::getName).collect(Collectors.toList());list.forEach(System.out::println);} 将元素收集到 set 里 Collectors.toSet() /*** 把流中的元素收集到set里。*/@Testvoid testCollectorsToSet() {Set<String> list= empList.stream().map(Employee::getName).collect(Collectors.toSet());list.forEach(System.out::println);} 把流中的元素收集到新创建的集合里Collectors.toCollection(HashSet::new) /*** 把流中的元素收集到新创建的集合里。*/@Testvoid testCollectorsToCollection() {HashSet<String> hs = empList.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));hs.forEach(System.out::println);} 根据比较器选择最大值 Collectors.maxBy() /*** 根据比较器选择最大值。*/@TestvoidtestCollectorsMaxBy(){Optional<Double> max = empList.stream().map(Employee::getSalary).collect(Collectors.maxBy(Double::compare));System.out.println(max.get());} 根据比较器选择最小值 Collectors.minBy() /*** 根据比较器选择最小值。*/@TestvoidtestCollectorsMinBy(){Optional<Double> max = empList.stream().map(Employee::getSalary).collect(Collectors.minBy(Double::compare));System.out.println(max.get());} 对流中元素的某个字段求和 Collectors.summingDouble() /*** 对流中元素的整数属性求和。*/@TestvoidtestCollectorsSummingDouble(){Double sum = empList.stream().collect(Collectors.summingDouble(Employee::getSalary));System.out.println(sum);} 对流中元素的某个字段求平均值 Collectors.averagingDouble() /*** 计算流中元素Integer属性的平均值。*/@TestvoidtestCollectorsAveragingDouble(){Double avg = empList.stream().collect(Collectors.averagingDouble(Employee::getSalary));System.out.println(avg);} 分组,类似sql的 group byCollectors.groupingBy /*** 分组*/@TestvoidtestCollectorsGroupingBy(){Map<Status, List<Employee>> map= empList.stream().collect(Collectors.groupingBy(Employee::getStatus));System.out.println(map);} 多级分组 /*** 多级分组*/@TestvoidtestCollectorsGroupingBy1(){Map<Status, Map<String, List<Employee>>> map= empList.stream().collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {if(e.getAge() >= 60)return"老年";elseif(e.getAge() >= 35)return"中年";elsereturn"成年";})));System.out.println(map);} 字符串拼接 Collectors.joining() /*** 字符串拼接*/@TestvoidtestCollectorsJoining(){String str = empList.stream().map(Employee::getName).collect(Collectors.joining(",", "----", "----"));System.out.println(str);} publicstaticStream<Character> filterCharacter(String str) {List<Character> list= newArrayList<>();for(Character ch : str.toCharArray()) {list.add(ch);}returnlist.stream();} 以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位 150页,8W字的Java知识手册 获取方式:1、公众号后台回复「手册」2、扫描下方二维码,回复「手册」 👆 长按上方二维码2 秒 回复「 手册 」即可获取资料 本文分享自微信公众号 - Java专栏(finishbug)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。