Java基础(下)之Stream

Stream流

Stream流的作用是结合Lambda表达式,简化集合、数组的操作,其使用步骤可总结为:

  1. 先得到一条Stream流(流水线),并把数据放上去;
    image
  2. 使用中间方法对流水线上数据进行操作;
    image
  3. 使用终结方法对流水线上数据进行操作;
    image

获取Stream流

package com.example.helloworld;
import java.io.*;
import java.util.*;
import java.util.stream.Stream;

class Main{

    public static void main(String[] args) throws Exception{
        //单列集合
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"张三","张三丰","李四","王二");
        list1.stream().forEach(name -> System.out.println(name));

        //双列集合
        HashMap<String,Integer>mp = new HashMap<>();
        mp.put("aaa",111);
        mp.put("bbb",222);
        mp.put("ccc",333);
        mp.put("ddd",444);
        mp.keySet().stream().forEach(e -> System.out.println(e));
        mp.entrySet().stream().forEach(pair -> System.out.println(pair));

        //数组
        int[] arr1 = {11,22,3,44,555};
        String[] arr2 = {"123","456","999"};
        Arrays.stream(arr1).forEach(num -> System.out.println(num));
        Arrays.stream(arr2).forEach(str -> System.out.println(str));

        //一堆零散数据
        //方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
        //但是数组必须是引用数据类型的,若传递基本数据类型,则会把整个数组当作一个元素,放到Stream中。
        Stream.of(1,2,3,4,5).forEach(num-> System.out.println(num));
        Stream.of("a","b","c","d","e").forEach(num-> System.out.println(num));
        Stream.of(arr1).forEach(num-> System.out.println(num));

    }
}

中间方法

package com.example.helloworld;
import java.util.*;
import java.util.stream.Stream;

class Main{

    public static void main(String[] args) throws Exception{
        //单列集合
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"赵四","李龙");

        ArrayList<String> list3 = new ArrayList<>();
        Collections.addAll(list3,"张三-10","张三丰-13","张益达-14");
        //过滤出张开头且长度为3的名字
        list1.stream()
                .filter(name -> name.startsWith("张"))
                .filter(name->name.length() == 3)
                .forEach(name -> System.out.printf("%s ",name));
        System.out.println();

        //只取前几个元素
        list1.stream()
                .limit(3)
                .forEach(name -> System.out.printf("%s ",name));
        System.out.println();

        //跳过前几个元素
        list1.stream()
                .skip(2)
                .forEach(name -> System.out.printf("%s ",name));
        System.out.println();

        //去重
        list1.stream()
                .distinct()
                .forEach(name-> System.out.printf("%s ",name));
        System.out.println();

        //合并两个流为一个流
        Stream.concat(list1.stream(),list2.stream())
                .forEach(name-> System.out.printf("%s ",name));
        System.out.println();

        //转换流中数据类型
        list3.stream().map(name -> Integer.parseInt(name.split("-")[1]))
                .forEach(age -> System.out.printf("%d ",age));
        System.out.println();

    }
}


注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程

ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"张三","张三丰","张益达","李四","王二");
        Stream<String> stream1 = list1.stream().filter(name -> name.startsWith("张") && name.length() == 3);
        stream1.forEach(name-> System.out.println(name));
        //Stream已经执行了终结方法后关闭了,无法再次执行中间方法
        stream1.filter(name->name.length()==3);

注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

终结方法

注意1:执行终结方法后,无法再接着使用该Stream;

package com.example.helloworld;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Main{

    public static void main(String[] args) throws Exception{
        //单列集合
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");

        //遍历流中的每个元素
        list1.stream().forEach(name-> System.out.printf("%s ",name));
        System.out.println();

        //统计流中元素的个数,返回值为long
        long count = list1.stream().count();
        System.out.println(count);

        //将流中的元素放入数组并返回,size为集合中的元素个数
        String[] arr1 = list1.stream().toArray(size->new String[size]);
        System.out.println(Arrays.toString(arr1));
		
		return ans.toArray(new int[ans.size()][]);//注意二维ArrayList转二维数组的写法

        //收集流中的数据,放到集合中(List、Set、Map)
        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"张三丰-男-15","李四-女-16","王二-男-22","张伦-男-20","张伦达-男-20");

        //收集到List集合中
        List<String> newlist = list2.stream()
                .filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
                .collect(Collectors.toList());//创建一个List,把流中元素放入其中并返回
        System.out.println(newlist);

        //收集到Set集合中,与List的区别在于:是否可重复、是否有序、是否可随机访问
        Set<String> newset = list2.stream()
                .filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
                .collect(Collectors.toSet());//创建一个Set,把流中元素放入其中并返回
        System.out.println(newset);

        //收集到Map集合中,其中姓名作为Key,年龄作为Value
        Map<String, Integer> newmap = list2.stream()
                .filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
                .collect(Collectors.toMap(person -> person.split("-")[0], person -> Integer.parseInt(person.split("-")[2])));
        System.out.println(newmap);
    }

总结

image

posted @ 2026-02-24 22:22  安河桥北i  阅读(4)  评论(0)    收藏  举报