Files
Java-Basic-and-Advanced/Stream流.md
2026-01-07 16:14:38 +08:00

7.0 KiB
Raw Blame History

Stream流介绍

配合lambda表达式简化集合和数组操作

获取Stream流对象

image-20251221181445689

Stream流中间操作方法

image-20251221182850306

获取对象流演示:

image-20251221194116622

示例:

ArrayList<String> list = new ArrayList<>();
        list.add("杏菜");
        list.add("佳树");
        list.add("小鞠");
        list.add("梦子");
        //集合Stream流对象
        list.stream().filter(s -> s.startsWith("杏")).forEach(s -> System.out.println(s));
        //数组流对象
        int[] arr = {1, 2, 3};
        Arrays.stream(arr).forEach(s-> System.out.println(s));
        HashSet<Integer> hs = new HashSet<>();
        hs.add(1);
        hs.add(4);
        hs.add(3);
        hs.add(5);
        //map集合流对象需要间接获取 - map.entrySet().stream
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("张",13);
        hm.put("李",14);
        hm.put("王",15);
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        entries.stream()
                .filter(entry -> !entry.getKey().startsWith("张"))
                .forEach(entry -> System.out.println(entry.getKey()+"---"+entry.getValue()));
        //零散数据获取Stream流对象
        Stream.of("1","e",3).forEach(s-> System.out.println(s));

中间操作方法

image-20251221200537334

示例:

ArrayList<Integer> list = new ArrayList<>();
        Stream<Integer> s2 = list.stream();
        ArrayList<Integer> list1= new ArrayList<>();
        Stream<Integer> s1 = list1.stream();
        Collections.addAll(list1,5,6,7);
        Collections.addAll(list,1,2,3,4);
        //filter过滤方法
        list.stream().filter(s -> s!=2).forEach(s-> System.out.print(s));
        System.out.println('\n');
        //limit获取前几个元素
        list.stream().limit(2).forEach(integer -> System.out.print(integer));
        System.out.println('\n');
        //skip跳过几个元素
        System.out.println("跳过之后的元素");
        list.stream().skip(1).forEach(s-> System.out.print(s));
        System.out.println('\n');
        //concat(Stream a,Stream b)合并ab为一个流
        Stream<Integer> s3 = Stream.concat(s1, s2);
        s3.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer s) {
                System.out.println(s);
            }
        });
        //distinct方法去除流中重复的元素依赖(hashCode 和 equals方法)
        //在此会报错,因为上面已经消费过了不能重新使用
        list.stream().distinct().forEach(s-> System.out.println(s));

image-20251221203020331

注意:若流已经被使用过,或已使用终结方法,就不允许再次使用

终结方法

image-20251221203822185

示例:

//count方法返回元素个数
Stream<Integer> s1 = Stream.of(2, 3, 4, 5, 6, 7, 8).filter(integer -> integer % 2 == 0);
long count = s1.count();
System.out.println(count);

重点:收集操作

为何因为Stream流操作是不会修改数据源的图为示例

image-20251221203945267

如何收集:

image-20251221205629800

示例:

//Stream流收集操作
Stream<Integer> s1 = Stream.of(1, 2, 3, 4, 5, 6, 7);
List list1 = s1.limit(3).collect(Collectors.toList());//JDK17版本之后可以将Collectors去除
System.out.println(list1);

转为map操作较为复杂

重点示例

//    将ArrayList中年龄大于15的收集到一个新的map集合中去
    public static void main(String[] args) {
        //将Stream流收集到map所需操作
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"杏菜,15","佳树,16","老马,17");
        Map<String, Integer> map = list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                //过滤操作将字符串数据从逗号切割装入数组0号索引为名字1号为年龄
                String[] split = s.split(",");
                //将字符串转为int类型并比较年龄返回大于等于16岁的
                int age = Integer.parseInt(split[1]);
                return age >= 16;
            }
        }).collect(Collectors.toMap(new Function<String, String>() {
            //创建map集合第一个匿名内部类为装入键值
            @Override
            public String apply(String s) {
                return s.split(",")[0];
            }
        }, new Function<String, Integer>() {
            //第二个为装入年龄值并将类型从String改为int
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s.split(",")[1]);
            }
        }));
        System.out.println(map);

Stream流综合案例

package com.icacat.day12;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class StreamDemo6 {
    public static void main(String[] args) {
        ArrayList<String> manList = new ArrayList<>();
        manList.add("温水和彦");
        manList.add("社长");
        manList.add("桐谷和人");
        manList.add("勇太");
        ArrayList<String> womanList = new ArrayList<>();
        womanList.add("杏菜");
        womanList.add("小鞠");
        womanList.add("佳树");
        womanList.add("千早");

        Stream<String> s1 = manList.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 4;
            }
        }).limit(2);
        Stream<String> s2 = womanList.stream().skip(1).filter(s -> s.startsWith("佳"));
        Stream<String> total = Stream.concat(s1, s2);
        total.forEach(new Consumer<String>() {
            @Override
            public void accept(String name) {
                Actor ac = new Actor(name);
                System.out.println(ac);
            }
        });
    }
}

class Actor{
    private String name;

    public Actor() {
    }

    public Actor(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Actor{name = " + name + "}";
    }
}