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

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

相关推荐
FQNmxDG4S18 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人18 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang19 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全19 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje19 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv719 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫19 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879219 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本19 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab20 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang