【从零开始学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\])));

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

相关推荐
唐青枫6 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马7 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261357 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261357 小时前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454751 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜1 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫1 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq1 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev1 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮1 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js