Java学习day30:Stream流入门、集合获取流对象、流对象的方法(知识点详解)

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


往期回顾

Java学习day29:线程池Pool中创建线程方式(面试必考!)-CSDN博客

Java学习day28:线程池Pool(知识点非常非常的详解)-CSDN博客

Java学习day27:join方法、生产者消费者模式(知识点详解)-CSDN博客

Java学习day30:Stream流入门、集合获取流对象、流对象的方法

一、 Stream流入门

Stream流的出现,是为了解决集合类库现有的弊端,为了提供一种更简洁、更灵活的数据处理方式。通过Stream流,可以轻松地对集合进行过滤、映射、排序、聚合等操作,而不需要显式地使用循环来处理数据。这样可以提高代码的可读性和可维护性,同时也更容易实现并行处理,从而提高程序的性能。

1.入门案例

下面我们通过一个案例来感受Stream流的作用。

现在有一个需求:

将list集合中姓张的名字元素过滤到新的集合中

①按我们以前集合的做法,就是创建两个集合,一个存入数据,然后遍历这个集合,把符合要求的数据拿出来放到另外一个集合,然后遍历那个集合得到数据。

import java.util.ArrayList;
import java.util.List;

public class Demo1 {
    public static void main(String[] args) {
        //将list集合中姓张的名字元素过滤到新的集合中
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张小三");
        list.add("李四");
        list.add("王五");
        list.add("张大山");
        //新建一个新的集合用来存姓张的元素
        List<String> list1 = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("张")) {
                list1.add(s);
            }
        }
        System.out.println(list1);
   }
}

②而如果我们使用stream流,则会出现另一种解决方案,我们可以将集合对象转换成流对象,使用两个方法,filter和foreach完成任务。

|------------------------------------------------------|------------------------|
| Stream<T> filter(Predicate<? super T> predicate) | 返回由与此给定谓词匹配的此流的元素组成的流。 |
| void forEach(Consumer<? super T> action) | 对此流的每个元素执行操作。 |

import java.util.function.Consumer;
import java.util.function.Predicate;

public class Demo1 {
    public static void main(String[] args) {
        //使用stream流操作
        //将集合对象转换成流对象
          list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张");
            }
        }).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
}

③而且我们会发现,两个方法里的参数,都是接口,如果大家足够熟悉,那么,我们就有了一个更加简便的写法,用lambad表达式

    import java.util.function.Consumer;
    import java.util.function.Predicate;

    public class Demo1 {
        public static void main(String[] args) {
            //使用stream流操作
            //将集合对象转换成流对象
            list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
        }
    }

大家可以看到,随着我们的不断改进,代码也越来越简洁。但是不知道大家能否感受到Stream流的作用。没关系,我们继续往下看。

二、集合获取流的对象

方式:根据集合获取流,将集合中的数据变成流的形式

这里大家好好理解一下,我们实际上就是通过各种方法,通过集合获取流的对象,有了流对象,我们就可以用流中的方法去操作原来集合中转变成流的数据。

1.三种方式

这三种方式,都是基于Collection接口下面的方法 streram(),因此,如果大家对集合的知识有所遗忘,需要先去补一补集合的有关知识,这样对于Stream流的学习会好很多。

传送门奉上:

Java学习day14:权限修饰符,集合(知识点+例题详解)-CSDN博客

①.根据List获取流对象

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Demo2 {
 public static void main(String[] args) {
    List<String> strings = new ArrayList<>();
    strings.add("老邢");
    strings.add("老邢xiao");
    strings.add("xiao邢");
    strings.add("xiao老邢");
    //获取流对象
     Stream<String> stream = strings.stream();
     System.out.println(stream);
 }
}

②.set获取stream对象

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;

public class Demo3 {
 public static void main(String[] args) {
     Set<String> set = new HashSet<>();
     set.add("嘻嘻");
     set.add("哈哈");
     Stream<String> stream = set.stream();
     System.out.println(stream);
 }
}

③.根据map集合获取流对象

复习一下,map集合添加数据的方法是put(),存储的是键值对,而且map对象没有stream()方法,所以需要转为list或者set对象,怎么转,在分别获取map对象的键和值的时候,就可以进行转化。

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;

public class Demo4 {
 public static void main(String[] args) {
     Map<String, String> map = new HashMap<>();
     map.put("1", "狗蛋");
     map.put("2", "腾飞");
     //先获取键
     Set<String> strings = map.keySet();
     Stream<String> stream = strings.stream();
     //获取值
     Collection<String> values = map.values();
     Stream<String> stream1 = values.stream();
     //
     Set<Map.Entry<String, String>> entries = map.entrySet();

     Stream<Map.Entry<String, String>> stream2 = entries.stream();
     
 }
}

三、Stream流对象下面的方法

流就是集合中的数据,流对象下面的方法是对原来集合中的数据进行操作的

1.常用方法

|-----------|-----------|----------|--------------|
| 方法的名称 | 方法的作用 | 方法种类 | 是否支持链式操作 |
| count | 统计个数 | 终结方法 | 否 |
| forEach | 逐个处理数据 | 终结方法 | 否 |
| filter | 过滤数据 | 函数的拼接 | 是 |
| limit | 取前几个 | 函数的拼接 | 是 |
| skip | 跳过前几个 | 函数的拼接 | 是 |
| map | 映射 | 函数的拼接 | 是 |
| concat | 拼接 | 函数的拼接 | 是 |

这里我们看两个点:

链式操作

什么是链式操作, 这里我们复习一下,所谓的链式操作就是说,在方法后面还可以.去调用其他方法,如果可以,就是支持链式操作。

方法种类

终结方法:对流操作的时候,链式操作的时候一定是写在最后的

函数拼接:方法还可以接着写方法

打个比方,工厂的流水线:都是先造手机电池->再造手机的主板->造手机端额外壳->一个成品。

所以终结方法一定是写在最后的。


以上,就是今天的所有知识点了。Stream流和集合这两个知识点关系密切,而且在以后的开发中会经常使用到,因此大家要自己多花点时间,静下心看代码,写代码,多理解,多运用,重点是多去运用。至于具体的方法介绍,我们就放到明天再说。

加油吧,预祝大家变得更强!

相关推荐
学习路上_write几秒前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
喵叔哟2 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟2 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk4 分钟前
maven环境搭建
java·maven
非概念6 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
远望清一色11 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
何曾参静谧19 分钟前
「Py」Python基础篇 之 Python都可以做哪些自动化?
开发语言·python·自动化
Prejudices23 分钟前
C++如何调用Python脚本
开发语言·c++·python
Daniel 大东23 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
wind瑞30 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea