首页 > 编程语言 >java之Stream流

java之Stream流

时间:2024-08-02 22:28:29浏览次数:8  
标签:java Stream stream list println 集合 操作

一、好处

1.直接阅读代码的字面意思  即可完美展示无关逻辑方式的语义: 获取流、 过滤姓张、 过滤长度为3、逐一打印

2.Stream流把真正的函数式编程风格引入到Java中

3.代码简洁

 

看下面的案例即可明白 

创建一个集合,存储多个字符串元素

把集合中所有以"张"开头的元素存储到一个新的集合

把"张"开头的集合中的长度为3的元素存储到一个新的集合

遍历上一步得到的集合

A.普通方式:

B.使用Stream流之后: 

一行代码就解决。 

总的来说 

Java的Stream流使得集合数组操作更为方便、直观,同时提高了代码的可读性和可维护性。

 注意:

在Java中,使用Stream API进行流操作时,原始集合或数组中的数据不会被修改。Stream操作返回一个新的流或集合,而原始数据集保持不变。流操作本身是非破坏性的,这意味着你可以安全地对集合进行操作而不会影响到原始数据。

二、思想 

 

通过上面的思维导入, Stream流有三种方法:

1.获取流

2.对流的中间操作

3.对流的终结操作

三、获取Stream流

获取Stream流的意思就是:创建一条流水线,并把数据放到流水线上准备进行操作  

 

用法示例: 

public class StreamDemo {
    public static void main(String[] args) {
        //Collection体系的集合可以使用默认方法stream()生成流
        List<String> list = new ArrayList<String>();
        Stream<String> listStream = list.stream();

        Set<String> set = new HashSet<String>();
        Stream<String> setStream = set.stream();

        //Map体系的集合间接的生成流
        Map<String,Integer> map = new HashMap<String, Integer>();
        Stream<String> keyStream = map.keySet().stream();
        Stream<Integer> valueStream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

        //数组可以通过Arrays中的静态方法stream生成流
        String[] strArray = {"hello","world","java"};
        Stream<String> strArrayStream = Arrays.stream(strArray);
      
      	//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
        Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
        Stream<Integer> intStream = Stream.of(10, 20, 30);
    }
}

四、中间操作  

中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作  

 

用法示例:

        ArrayList<String> strings = new ArrayList<>();
        Collections.addAll(strings, "a", "b", "c", "d","d", "e", "f", "g", "h");
        //过滤  输出d d
        strings.stream().filter(m -> m.startsWith("d")).forEach(System.out::println);

        //获取前面几个元素  输出a b c
        strings.stream().limit(3).forEach(System.out::println);

        //跳过前面几个元素  输出d d e f g h
        strings.stream().skip(3).forEach(System.out::println);

        //元素去重  输出a b c d e f g h
        strings.stream().distinct().forEach(System.out::println);

        //合并两个流 工具类用法
        //输出a b c d d e f g h a b c d d e f g h
        Stream.concat(strings.stream(),strings.stream()).forEach(System.out::println);

转换流中的数据类型

 //转换流中的数据类型
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三-11","李四-12","王麻子-13","刘婷婷-14");
//匿名内部类写法
list.stream().map(new Function<String, Integer>(){
    @Override
    public Integer apply(String s) {
            String[] arr = s.split("-");
            String ageString = arr[1];
            return Integer.parseInt(ageString);
        }
    }).forEach(System.out::println);    //11 12 13 14
System.out.println("-----------------------------------------------------");
//函数式接口方法
list.stream()
        .map(s -> Integer.parseInt(s.split("-")[1]))
        .forEach(System.out::println);//11 12 13 14

五、 终结操作

 终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

终结方法不再返回Stream流,链式操作到终结方法就不能用(.方法)链式操作下去了。 

 

遍历和统计示例: 

 

转换数组示例: 

 

六、收集操作 

收集操作就是,将Stream流中的数据放入到数组或集合中返回一个数组或集合

收集操作也是属于终结操作的一种,上面介绍了数组,这里介绍集合。 

利用工具类Collectors提供了具体的收集方式  

转化为List、Set集合的用例: 

转化为Map集合的用例子: 

A.函数式接口写法

ArrayList<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");

Map<String, Integer> map = list.stream().filter(
        s -> {
            String[] split = s.split(",");
            int age = Integer.parseInt(split[1]);
                    return age >= 24;
        })

//   collect方法只能获取到流中剩余的每一个数据.
//在底层不能创建容器,也不能把数据添加到容器当中

//Collectors.toMap 创建一个map集合并将数据添加到集合当中

// s 依次表示流中的每一个数据

//第一个lambda表达式就是如何获取到Map中的键
//第二个lambda表达式就是如何获取Map中的值
.collect(Collectors.toMap(
        s -> s.split(",")[0],
        s -> Integer.parseInt(s.split(",")[1]) ));

System.out.println(map);

B.匿名内部类写法 

 

 注意:在转化为Map集合的时候,如果键有重复,就会报错。

 

标签:java,Stream,stream,list,println,集合,操作
From: https://blog.csdn.net/2202_75483664/article/details/140849469

相关文章

  • java之方法引用 —— ::
    目录一、简介二、引用静态方法 1.格式  2.示例​编辑3.条件解析  三、引用成员方法1.格式 2.示例 四、引用构造方法 1.格式 2.示例五、类名引用成员方法1.格式2.略微不同的方法引用规则 3.示例六、引用数组的构造方法 1.格式2.示例一、简介......
  • Java基础5
    数组的概念数组(Array)是多个相同类型数据按照一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 几个相关概念:①数组名 ②数组的元素 ③数组的下标 ④数组的长度特点:数组中的元素在内存中是依次紧密排列的,有序的。数组,属于引用数据类......
  • Java常用集合类的接口方法
    ......
  • Python应用开发——30天学习Streamlit Python包进行APP的构建(23):构建多页面应用程序
    创建动态导航菜单通过st.navigation,可以轻松创建动态导航菜单。您可以在每次重新运行时更改传递给st.navigation的页面集,从而更改与之匹配的导航菜单。这是创建自定义、基于角色的导航菜单的便捷功能。本教程使用st.navigation和st.Page,它们是在Streamlit1.36.0版中......
  • Java HashMap 源码解读笔记(二)--xunznux
    文章目录HashMapputVal插入新值方法方法解读1.7和1.8有哪些区别resize重新哈希方法treeifyBin树化方法treeify树化方法untreeify链化方法HashMap本文主要是用于记录我在阅读Java1.8的HashMap源码所做的笔记。对于源码中的注释会进行翻译下来,并且会对其中部......
  • Java HashMap 源码解读笔记(一)--xunznux
    文章目录HashMap介绍实现说明:源码解读静态常量和内部节点类Node静态工具方法属性字段Fields未完待续。。。HashMap本文主要是用于记录我在阅读Java1.8的HashMap源码所做的笔记。对于源码中的注释会进行翻译下来,并且会对其中部分源码进行注释。这一篇文章主要......
  • 【Java】Jsoup 解析HTML报告
    一、需求背景有好几种报告文件,目前是人肉找报告信息填到Excel上生成统计信息跟用户交流了下需求和提供的几个文件,发现都是html文件其实所谓的报告的文件,就是一些本地可打开的静态资源,里面也有js、img等等二、方案选型前面老板一直说是文档解析,我寻思这不就是写爬虫吗....因......
  • 基于Java养老院管理系统设计和实现(源码+LW+调试文档+讲解等)
    详细视频演示:请联系我获取更详细的演示视频系统技术介绍:后端框架SpringBootSpringBoot内置了Tomcat、Jetty和Undertow等服务器,这意味着你可以直接使用它们而不需要额外的安装和配置。SpringBoot的一个主要优点是它的自动配置功能。它可以根据你的项目中的依赖关......
  • javascript学习 - DOM 元素获取、属性修改
    什么是WebAPIWebAPI是指网页服务器或者网页浏览器的应用程序接口。简单来讲,就是我们在编写JavaScript代码时,可以通过WebAPI来操作HTML网页和浏览器。WebAPI又可以分为两类:DOM(文档对象模型)BOM(浏览器对象模型)DOM(DocumentObjectModel),即文档对象模型,主要用......
  • javascript学习 - DOM 事件
    事件什么是事件在之前DOM的学习中,我们主要学习了如何获取DOM元素,并且学会了如何给获取的元素进行属性修改等操作。但这些基本都是静态的修改,并没有接触到一些动作。而今天要学习的事件,其实就是这些动作的总称。所谓事件,就是在编程时系统内所发生的动作或者发生的事情......