【从零开始学Java | 第三十一篇下】Stream流

张开发
2026/5/3 15:35:40 15 分钟阅读
【从零开始学Java | 第三十一篇下】Stream流
目录前言一、Stream流的中间操作1.filter过滤2.limit获取前n个元素3.skip跳过前n个元素4.distinct去重5.concat拼接6.map类型转换二、Stream流中的终结方法1.forEach遍历2.count统计3.toArray转换成数组前言在上篇学习了如何将单列集合、双列集合、数组、零散数据转换成Stream流在下篇将学习中间方法和终结方法即对Stream流进行过滤、切块、包装最终产出我们想要的成品。一、Stream流的中间操作Stream流的中间方法名称说明StreamTfilter(Predicate? super T predicate)过滤StreamTlimit(long maxSize)获取前几个元素StreamTskip(long n)跳过前几个元素StreamTdistinct()元素去重依赖hashCode和equals方法staticT StreamTconcat(Stream a, Stream b)合并a和b两个流为一个流StreamRmap(FunctionT, R mapper)转换流中的数据类型注1使用中间方法会返回新的Stream流了原来的Stream流只能使用一次建议使用链式编程注2修改Stream流中的数据不会影响原来集合或者数组中的数据。1.filter过滤需求将姓李的名字长度为3的人名过滤出来。使用方法public class Test { public static void main(String[] args) { //Stream的过滤filter ArrayListString list new ArrayList(); Collections.addAll(list, 李二, 张三, 王五, 李老板, 李世民, 王二); list.stream() .filter(s - s.startsWith(李)) .filter(s - s.length() 3) .forEach(s - System.out.println(s)); } }输出2.limit获取前n个元素需求获取前三个元素。使用方法public class Test { public static void main(String[] args) { //Stream的过滤filter ArrayListString list new ArrayList(); Collections.addAll(list, 李二, 张三, 王五, 李老板, 李世民, 王二); //Stream的limit list.stream() .limit(3) .forEach(s - System.out.println(s)); } }输出3.skip跳过前n个元素需求跳过前4个元素。使用方法public class Test { public static void main(String[] args) { ArrayListString list new ArrayList(); Collections.addAll(list, 李二, 张三, 王五, 李老板, 李世民, 王二); //Stream的skip list.stream() .skip(4) .forEach(s - System.out.println(s)); } }输出4.distinct去重需求去除流中重复的元素。使用方法public class Test { public static void main(String[] args) { ArrayListString list new ArrayList(); Collections.addAll(list, 李二, 张三,张三,张三, 王五, 李老板, 李世民, 王二); //Stream中的distinct去重 list.stream() .distinct() .forEach(s - System.out.println(s)); } }输出5.concat拼接需求将两个流进行拼接使用方法public class Test { public static void main(String[] args) { ArrayListString list new ArrayList(); Collections.addAll(list, 李二, 张三,张三,张三, 王五, 李老板, 李世民, 王二); ArrayListString list2 new ArrayList(); Collections.addAll(list, 李四, 王五); //Stream中的concat拼接 Stream.concat(list.stream(), list2.stream()) .forEach(s - System.out.println(s)); } }6.map类型转换使用方法Function中的两个类型第一个类型表示流的类型第二个类型表示希望转换成的类型。apply的形参s依次表示流里面的每一个数据。apply的返回值表示转换之后的数据。public class Test { public static void main(String[] args) { ArrayListString list new ArrayList(); Collections.addAll(list, 张三-13, 李四-14, 王五-15); list.stream() .map(new FunctionString, Integer() { Override public Integer apply(String s) { String[] split s.split(-); String ageString split[1]; int age Integer.parseInt(ageString); return age; } }) .forEach(s - System.out.println(s)); } }转换成Lambda表达式list.stream() .map(s - Integer.parseInt(s.split(-)[1])).forEach(s - System.out.println(s));二、Stream流中的终结方法名称说明voidforEach(Consumer action)遍历longcount()统计toArray()收集流中的数据放到数组中collect(Collector collector)收集流中的数据放到集合中1.forEach遍历list.stream().forEach(new ConsumerString() { Override public void accept(String s) { System.out.println(s); } });转换成Lambda表达式list.stream() .forEach(s - System.out.println(s));2.count统计long count list.stream().count(); System.out.println(count);3.toArray转换成数组IntFunction的泛型具体类型的数组apply的形参流中数据的个数要跟数组的长度保持一致。apply的返回值具体类型的数组方法体创建数组//toArray String[] array list.stream().toArray(new IntFunctionString[]() { Override publicString[]apply(intvalue) { return newString[value]; } }); System.out.println(Arrays.toString(array));转换成Lambda表达式String[] array list.stream() .toArray(value - new String[value]);‍️‍️‍️

更多文章