Lambda 流的常用方法用案列讲解一下。
ForEach
集合的遍历forEach方法
1 public void testForEach(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 8 list.forEach(s-> System.out.println(s)); 9 }
Collect
将操作后的对象转化为新的对象
1 public void testCollect(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("2"); 6 }}; 7 8 //转换为新的list 9 List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList()); 10 }
Filter
Filter 为过滤的意思,只要满足 Filter 表达式的数据就可以留下来,不满足的数据被过滤掉
1 public void testFilter() { 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 8 list.stream() 9 // 过滤掉我们希望留下来的值 10 // 表示我们希望字符串是 1 能留下来 11 // 其他的过滤掉 12 .filter(str -> "1".equals(str)) 13 .collect(Collectors.toList()); 14 }
Map
map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B
1 public void testMap() { 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 //通过 map 方法list中元素转化成 小写 8 List<String> strLowerList = list.stream() 9 .map(str -> str.toLowerCase()) 10 .collect(Collectors.toList()); 11 }
MapToInt
mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了,源码如下:
1 public void testMapToInt() { 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 list.stream() 8 .mapToInt(s->Integer.valueOf(s)) 9 // 一定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为已经确定是 int 类型了 10 // 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以需要使用 mapToObj 11 // 方法返回有泛型的流 12 .mapToObj(s->s) 13 .collect(Collectors.toList()); 14 15 list.stream() 16 .mapToDouble(s->Double.valueOf(s)) 17 // DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法 18 .sum(); 19 }
Distinct
distinct 方法有去重的功能
1 public void testDistinct(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("2"); 6 }}; 7 list.stream() 8 .map(s -> Integer.valueOf(s)) 9 .distinct() 10 .collect(Collectors.toList()); 11 }
Sorted
Sorted 方法提供了排序的功能,并且允许我们自定义排序
1 public void testSorted(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 list.stream() 8 .map(s -> Integer.valueOf(s)) 9 // 等同于 .sorted(Comparator.naturalOrder()) 自然排序 10 .sorted() 11 .collect(Collectors.toList()); 12 13 // 自定义排序器 14 list.stream() 15 .map(s -> Integer.valueOf(s)) 16 // 反自然排序 17 .sorted(Comparator.reverseOrder()) 18 .collect(Collectors.toList()); 19 }
groupingBy
groupingBy 是能够根据字段进行分组,toMap 是把 List 的数据格式转化成 Map 的格式
1 public void testGroupBy(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("2"); 6 }}; 7 8 Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> { 9 if("2".equals(s)) { 10 return "2"; 11 }else { 12 return "1"; 13 } 14 })); 15 }
FindFirst
findFirst 表示匹配到第一个满足条件的值就返回
1 public void testFindFirst(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("2"); 6 }}; 7 8 list.stream() 9 .filter(s->"2".equals(s)) 10 .findFirst() 11 .get(); 12 13 // 防止空指针 14 list.stream() 15 .filter(s->"2".equals(s)) 16 .findFirst() 17 // orElse 表示如果 findFirst 返回 null 的话,就返回 orElse 里的内容 18 .orElse("3"); 19 20 Optional<String> str= list.stream() 21 .filter(s->"2".equals(s)) 22 .findFirst(); 23 // isPresent 为 true 的话,表示 value != null 24 if(str.isPresent()){ 25 return; 26 } 27 }
Reduce
reduce 方法允许我们在循环里面叠加计算值
1 public void testReduce(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 8 list.stream() 9 .map(s -> Integer.valueOf(s)) 10 // s1 和 s2 表示循环中的前后两个数 11 .reduce((s1,s2) -> s1+s2) 12 .orElse(0); 13 14 list.stream() 15 .map(s -> Integer.valueOf(s)) 16 // 第一个参数表示基数,会从 100 开始加 17 .reduce(100,(s1,s2) -> s1+s2); 18 }
Peek
peek 方法很简单,我们在 peek 方法里面做任意没有返回值的事情,比如打印日志
1 public void testPeek(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 list.stream().map(s -> Integer.valueOf(s)) 8 .peek(s -> System.out.println(s)) 9 .collect(Collectors.toList()); 10 }
Limit
limit 方法会限制输出值个数,入参是限制的个数大小
1 public void testLimit(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("3"); 6 }}; 7 list.stream() 8 .map(s -> Integer.valueOf(s)) 9 .limit(2L) 10 .collect(Collectors.toList()); 11 }
Max,Min
通过max、min方法,可以获取集合中最大、最小的对象
1 public void testMaxMin(){ 2 List<String> list = new ArrayList<String>() {{ 3 add("1"); 4 add("2"); 5 add("2"); 6 }}; 7 8 list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get(); 9 list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get(); 10 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?