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

目录

前言

一、Stream流的中间操作

1.filter过滤

2.limit获取前n个元素

3.skip跳过前n个元素

4.distinct去重

5.concat拼接

6.map类型转换

二、Stream流中的终结方法

1.forEach遍历

2.count统计

3.toArray转换成数组

4.collect收集


前言

在上篇,学习了如何将单列集合、双列集合、数组、零散数据转换成Stream流,在下篇,将学习中间方法终结方法,即对Stream流进行过滤、切块、包装,最终产出我们想要的成品。

一、Stream流的中间操作

名称 说明
Stream<T> filter(Predicate<? super T> predicate) 过滤
Stream<T> limit(long maxSize) 获取前几个元素
Stream<T> skip(long n) 跳过前几个元素
Stream<T> distinct() 元素去重,依赖hashCode和equals方法
static<T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream<R> map(Function<T, R> mapper) 转换流中的数据类型
[Stream流的中间方法]

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

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

1.filter过滤

需求:将姓李的名字长度为3的人名过滤出来。

使用方法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        //Stream的过滤filter
        ArrayList<String> 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个元素

需求:获取前三个元素。

使用方法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        //Stream的过滤filter
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "李二", "张三", "王五", "李老板", "李世民", "王二");

        //Stream的limit
        list.stream()
                .limit(3)
                .forEach(s -> System.out.println(s));
    }
}

输出:

3.skip跳过前n个元素

需求:跳过前4个元素。

使用方法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "李二", "张三", "王五", "李老板", "李世民", "王二");

        //Stream的skip
        list.stream()
                .skip(4)
                .forEach(s -> System.out.println(s));
    }
}

输出:

4.distinct去重

需求:去除流中重复的元素。

使用方法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "李二", "张三","张三","张三", "王五", "李老板", "李世民", "王二");

        //Stream中的distinct去重
        list.stream()
                .distinct()
                .forEach(s -> System.out.println(s));
    }
}

输出:

5.concat拼接

需求:将两个流进行拼接

使用方法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "李二", "张三","张三","张三", "王五", "李老板", "李世民", "王二");

        ArrayList<String> 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的返回值:表示转换之后的数据。

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张三-13", "李四-14", "王五-15");

        list.stream()
                .map(new Function<String, 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流中的终结方法

名称 说明
void forEach(Consumer action) 遍历
long count() 统计
toArray() 收集流中的数据,放到数组中
collect(Collector collector) 收集流中的数据,放到集合中

1.forEach遍历

复制代码
list.stream().forEach(new Consumer<String>() {
    @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 IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
});
System.out.println(Arrays.toString(array));

转换成Lambda表达式

复制代码
String[] array = list.stream()
        .toArray(value -> new String[value]);

4.collect收集

collect可以将流转换成List、Set、Map类型。

toMap参数一:表示键的生成规则

toMap参数二:表示值的生成规则

Function泛型一:表示流中每一个数据的类型

Function泛型二:表示Map集合中键/值的数据类型

方法apply形参:依次表示流里面的每一个数据

方法apply方法体:生成键/值的代码

方法apply返回值:已经生成的键/值

复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张三疯-男-19", "李四海-男-20", "王老五-男-25", "李凤-女-18", "刘大壮-男-20");

        Map\<String, Integer\> collect = list.stream()
.filter(s -\> "男".equals(s.split("-")\[1\]))
.collect(Collectors.toMap(new Function\<String, String\>() {
@Override
public String apply(String s) {
return s.split("-")\[0\];
}
}, new Function\<String, Integer\>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")\[2\]);
}
}));

        System.out.println(collect);
    }
}

转换成Lambda表达式:

复制代码
Map<String, Integer> collect = list.stream()
        .filter(s -> "男".equals(s.split("-")[1]))
        .collect(Collectors.toMap(s -\> s.split("-")\[0\], s -\> Integer.parseInt(s.split("-")\[2\])));

😶‍🌫️😶‍🌫️😶‍🌫️

相关推荐
❀͜͡傀儡师4 小时前
Spring AI Alibaba vs. AgentScope:两个阿里AI框架,如何选择?
java·人工智能·spring
aq55356004 小时前
Laravel10.x重磅升级,新特性一览
android·java·开发语言
一 乐4 小时前
酒店预订|基于springboot + vue酒店预订系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·酒店预订系统
报错小能手5 小时前
ios开发方向——swift错误处理:do/try/catch、Result、throws
开发语言·学习·ios·swift
Moe4885 小时前
Spring AI Advisors:从链式增强到递归顾问
java·后端
敖正炀5 小时前
ReentrantReadWriteLock、ReentrantLock、synchronized 对比
java
网域小星球5 小时前
C 语言从 0 入门(十七)|结构体指针 + 动态内存 + 文件综合实战
c语言·开发语言·文件操作·结构体指针·动态内存·综合项目
cike_y5 小时前
Java反序列化漏洞-Shiro721流程分析
java·反序列化·shiro框架
aq55356005 小时前
三大编程语言深度对比:C# vs 易语言 vs 汇编
开发语言·汇编·c#