Java 8 中Stream用法
Stream
是Java 8
新增的接口,Stream
可以认为是一个高级版本的 Iterator
。 废话不多说直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @SpringBootTest class DemoApplicationTests { /* 1.filter:用于根据指定条件过滤元素.它接收一个条件作为参数, 只保留满足条件的元素, 并生成一个新的Stream */ @Test void filterTest() { List<String> tempList = Arrays.asList( "初一" , "初二" , "初三" , "初四" ); List<String> resList = tempList.stream() .filter(s -> s.contains( "二" )) .collect(Collectors.toList()); System.out.println(resList.toString()); } /* 2.map:用于对每个元素执行映射操作, 将元素转换成另一种类型.它接收一个Function(映射函数)作为参数, 对每个元素应用该映射函数, 并生成一个新的Stream. */ @Test void mapTest() { List<String> tempList = Arrays.asList( "初一" , "初二" , "初三" , "初四" ); List<String> resList = tempList.stream() .map(s -> "今天: " + s) .collect(Collectors.toList()); System.out.println(resList.toString()); } /* 3.sorted():用于对Stream中的元素进行排序,默认按照自然顺序进行排序。也可以传入自定义的Comparator来指定排序规则。 */ @Test void sortedTest() { List<Integer> numList = Arrays.asList( 10 , 20 , 18 , 300 , 30 , 2 ); // ① 默认排序 List<Integer> orderList = numList.stream() .sorted() .collect(Collectors.toList()); System.out.printf( "① 默认排序: %s%n" , orderList); // ② 自定义排序 List<Integer> orderDescList = numList.stream() .sorted((x, y) -> { return y.compareTo(x); }) .collect(Collectors.toList()); System.out.printf( "② 自定义排序: %s%n" , orderDescList); } /* 4.distinct():用于去除 Stream 中重复的元素,确保最终的 Stream 中每个元素都是唯一的。 */ @Test void distinctTest() { List<Integer> numList = Arrays.asList( 1 , 1 , 1 , 1 , 2 , 3 , 2 , 2 ); List<Integer> distinctList = numList.stream() .distinct() .collect(Collectors.toList()); System.out.println(distinctList); } /* 5.limit(long n):用于限制Stream的大小,返回一个最大包含前n个元素的新Stream。 */ @Test void limitTest() { List<Integer> numList = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); List<Integer> limitList = numList.stream() .limit( 4 ) .collect(Collectors.toList()); System.out.println(limitList); } /* 6.skip(long n):用于跳过Stream中的前n个元素,返回一个丢弃了前n个元素后剩余元素的新Stream。 */ @Test void skipTest() { List<Integer> numList = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); List<Integer> skipList = numList.stream() .skip(numList.size() - 2 ) .collect(Collectors.toList()); System.out.println(skipList); } /* 7.forEach(Consumer):对Stream中的每个元素执行指定的操作,接收一个Consumer(消费者函数)作为参数。它通常用于对Stream中的元素进行输出或执行某些操作,但不会返回任何结果。 */ @Test void forEachTest() { // 给公司工资普涨 500 List<Integer> salaryList = Arrays.asList( 12000 , 20000 , 30000 , 4000 ); salaryList.stream() .map(s -> s + 500 ) .forEach(s -> { System.out.println( "--工资普涨后:" + s); }); } /* 8.collect(Collector):用于将Stream中的元素收集到一个容器中,接收一个Collector(收集器)作为参数。它允许你在Stream中执行各种集合操作, 例如将元素收集到List、Set、Map等容器中。 如下代码的含义是创建一个人员集合,通过 stream() 转换为 Stream 流,使用 collect() 方法把元素归集, 利用 Collectors.toMap() 收集器转换为 Map 后,内部接收会遍历每个元素,Collectors.toMap(User::getName, User::getSalary)是简写, 详细的写法如下:Collectors.toMap(s -> s.getName(), s -> s.getSalary()) */ @Test void collectTest() { List<User> userList = Arrays.asList( new User( "张三" , 2000.5 ), new User( "李斯" , 11000.5 ), new User( "王二" , 12000.5 ), new User( "张六" , 32000.5 ), new User( "赵公子" , 1000000.0 )); Map<String, Double> userSalaryMap = userList.stream() .collect(Collectors.toMap(User::getName, User::getSalary)); userSalaryMap.forEach((k, v) -> { System.out.printf( "姓名:%s,工资:%.2f%n" , k, v); }); } /* 9.anyMatch(Predicate) / allMatch(Predicate) / noneMatch(Predicate) Stream 类的 anyMatch(), allMatch(), 和 noneMatch() 是用于检查流中元素是否满足特定条件的终端操作。 它们返回一个布尔值,表示流中的元素是否满足指定的条件。这些方法在遇到满足条件的元素后可能会提前终止流的处理。 anyMatch检查是否有任意元素满足条件,allMatch检查是否所有元素都满足条件,noneMatch检查是否没有元素满足条件。 */ @Test void MatchTest() { // 示例整数流 Stream<Integer> integerStream = Stream.of( 1 , 5 , 3 , 8 , 2 ); // 使用anyMatch()检查是否存在元素大于5 boolean anyGreaterThan5 = integerStream.anyMatch(num -> num > 5 ); System.out.println( "是否存在元素大于 5 ?" + anyGreaterThan5); // 重新创建一个整数流,因为流已被消耗 Stream<Integer> newIntegerStream = Stream.of( 1 , 5 , 3 , 8 , 2 ); // 使用allMatch()检查是否所有元素都小于10 boolean allLessThan10 = newIntegerStream.allMatch(num -> num < 10 ); System.out.println( "所有元素都小于10 ? " + allLessThan10); // 重新创建一个整数流,因为流已被消耗 Stream<Integer> newestIntegerStream = Stream.of( 1 , 5 , 3 , 8 , 2 ); // 使用noneMatch()检查是否没有元素等于10 boolean noneEqualTo10 = newestIntegerStream.noneMatch(num -> num == 10 ); System.out.println( "是否没有元素等于 10 ? " + noneEqualTo10); } /* 10.findFirst() / findAny() Stream 类的 findFirst() 和 findAny() 方法用于在流中查找元素的终端操作。它们都返回一个 Optional 对象,表示找到的元素或元素的可能性。 */ @Test void findTest() { // 示例整数流 Stream<Integer> integerStream = Stream.of( 1 , 5 , 3 , 8 , 2 ); // 使用findFirst()找到第一个元素 Optional<Integer> firstElementOptional = integerStream.findFirst(); System.out.println( "发现第一个元素: " + firstElementOptional.get()); //isPresent() 判断流是否为null if (firstElementOptional.isPresent()) { System.out.println( "发现第一个元素: " + firstElementOptional.get()); } else { System.out.println( "流为空!" ); } // 使用findAny()找到任意一个元素 Stream<Integer> stream = Stream.of( 1 , 2 , 3 ); Optional<Integer> any = stream.findAny(); System.out.println( "找到任意一个元素: " +any.get()); // 资料说:可能输出 1、2 或 3 但实际操作每次都输出1 } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.example.demo; public class User { private String name; private Double salary; public String getName() { return name; } public void setName(String name) { this .name = name; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this .salary = salary; } public User(String name, Double salary) { this .name = name; this .salary = salary; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!