畅游Java流:深入探索Stream流

news/2024/7/23 15:27:54 标签: java, python, 开发语言

为何选择Stream流?

  • 以直观的代码展示逻辑,简洁明了
  • Stream流引入真正的函数式编程风格到Java中
  • 代码更为简洁,不受无关逻辑方式的约束

Stream流的三类方法

1. 获取Stream流

  • 创建流水线,准备对数据进行操作

2. 中间方法

  • 操作流水线上的数据
  • 可以进行多个中间操作

3. 终结方法

  • 一个Stream流只能有一个终结方法
  • 是流水线上的最后一个操作

生成Stream流的方式

  • Collection体系集合
    • 使用默认方法stream()生成流:default Stream < E > stream()
  • Map体系集合
    • 把Map转成Set集合,间接生成流
  • 数组
    • 通过Arrays中的静态方法stream生成流
  • 同种数据类型的多个数据
    • 通过Stream接口的静态方法of(T...values)生成流

代码演示

java">javaCopy codepublic 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流中间操作方法

概念

中间操作执行后,Stream流仍然可以继续进行其他操作

常见方法

  • filter(Predicate predicate): 对流中的数据进行过滤
  • limit(long maxSize): 返回流中指定参数个数的元素
  • skip(long n): 跳过指定参数个数的元素,返回剩余元素组成的流
  • concat(Stream a, Stream b): 合并两个流为一个流
  • distinct(): 返回由不同元素组成的流

代码演示

filter方法演示
java">javaCopy codepublic class MyStream3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        list.add("王二麻子");
        list.add("张良");
        list.add("谢广坤");

        // 使用lambda表达式简化代码
        list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
    }
}
limit和skip方法演示
java">javaCopy codepublic class StreamDemo02 {
    public static void main(String[] args) {
        // 创建一个集合,存储多个字符串元素
        ArrayList<String> list = new ArrayList<String>();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        // 取前3个数据在控制台输出
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("--------");

        // 跳过3个元素,把剩下的元素在控制台输出
        list.stream().skip(3).forEach(System.out::println);
        System.out.println("--------");

        // 跳过2个元素,把剩下的元素中前2个在控制台输出
        list.stream().skip(2).limit(2).forEach(System.out::println);
    }
}
concat和distinct方法演示
java">javaCopy codepublic class StreamDemo03 {
    public static void main(String[] args) {
        // 创建一个集合,存储多个字符串元素
        ArrayList<String> list = new ArrayList<String>();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        // 合并前4个数据和跳过2个数据得到的流,并输出
        Stream.concat(list.stream().limit(4), list.stream().skip(2)).forEach(System.out::println);
        
        // 合并前4个数据和跳过2个数据得到的流,去重后输出
        Stream.concat(list.stream().limit(4), list.stream().skip(2)).distinct().forEach(System.out::println);
    }
}

Stream流终结操作方法

概念

终结操作执行后,Stream流将不能再执行其他操作

常见方法

  • forEach(Consumer action): 对每个元素执行操作
  • count(): 返回流中的元素个数

代码演示

java">javaCopy codepublic class MyStream5 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        list.add("王二麻子");
        list.add("张良");
        list.add("谢广坤");

        // 使用lambda表达式简化代码
        list.stream().forEach(System.out::println);

        // 返回流中的元素个数
        long count = list.stream().count();
        System.out.println(count);
    }
}

Stream流的收集操作

概念

对数据使用Stream流的方式操作完毕后,可以把数据收集到集合中

常用方法

  • collect(Collector collector): 把结果收集到集合中

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

  • toList(): 把元素收集到List集合中
  • toSet(): 把元素收集到Set集合中
  • toMap(Function keyMapper, Function valueMapper): 把元素收集到Map集合中

代码演示

toList和toSet方法演示
java">javaCopy codepublic class MyStream7 {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list1.add(i);
        }

        list1.add(10);
        list1.add(10);
        list1.add(10);
        list1.add(10);
        list1.add(10);

        // 使用lambda表达式简化代码
        List<Integer> list = list1.stream().filter(number -> number % 2 == 0)
                .collect(Collectors.toList());

        System.out.println(list);

        Set<Integer> set = list1.stream().filter(number -> number % 2 == 0)
                .collect(Collectors.toSet());
        System.out.println(set);
    }
}
toMap方法演示
java">javaCopy codepublic class MyStream8 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("zhangsan,23");
        list.add("lisi,24");
        list.add("wangwu,25");

        // 使用lambda表达式简化代码
        Map<String, Integer> map = list.stream().filter(
                s -> {
                    String[] split = s.split(",");
                    int age = Integer.parseInt(split[1]);
                    return age >= 24;
                }
        ).collect(Collectors.toMap(
                s -> s.split(",")[0],
                s -> Integer.parseInt(s.split(",")[1])
        ));

        System.out.println(map);
    }
}

探索Java中Stream流的使用,让代码更为清晰、简洁,充分发挥函数式编程的优势。畅游在Stream流的操控中,体验Java的新风尚!


http://www.niftyadmin.cn/n/5247791.html

相关文章

【五分钟】熟悉python列表和元组的异同点【看这篇够用!建议收藏】

引言 Python&#xff0c;是一种广泛应用于数据科学、机器学习等领域的高级编程语言&#xff0c;支持多种丰富多样的数据类型&#xff0c;其中包括列表和元组。尽管这两种数据结构都可用于存储多个值&#xff0c;但它们在功能和特性上存在着明显的差异。在接下来的博客中&#…

东北地理所最新Nature通讯文章

作为城市的重要组织部分&#xff0c;城市湿地在水源供给、增湿降温、雨洪调蓄等多个方面发挥着极其重要的作用&#xff0c;2024年国际湿地日主题定为“湿地与人类福祉”。在此背景下&#xff0c;中国科学院东北地理与农业生态研究所毛德华研究员等在12月5日出版的Nature发表题为…

融合科技,升级医疗体验——医院陪诊服务的技术创新

随着科技的迅猛发展&#xff0c;医疗服务领域也在积极借助技术手段提升患者体验。本文将探讨如何利用先进的技术代码&#xff0c;将医院陪诊服务推向新的高度。 1. 医疗预约系统的实现 # 通过Python代码实现医疗预约系统 class MedicalAppointment:def __init__(self, patie…

机器学习--稀疏学习

前置知识&#xff1a; 通常学习一次模型的过程如下&#xff1a;我们普遍为了获取更好的模型效果&#xff0c;直接对原始数据学习&#xff0c;会造成过拟合、需要特征提取&#xff1b; 而若特征提取完后依旧有很多特征&#xff0c;还是会容易过拟合。这时候就需要特征降维和特…

java泛型:泛型类,泛型方法

今日记录我的泛型使用&#xff0c;供后期查阅。 主要包含泛型类&#xff0c;泛型属性&#xff0c;泛型方法&#xff0c;静态方法中使用泛型。 public class GenericOperationResultRep<T> {private boolean success; // 是否操作成功。true&#xff0c;成功&#xff1b;f…

【数据结构】链表算法总结

知识概览 链表包括单链表和双链表&#xff0c;这里讨论算法题中的链表。为了考虑算法题中对于时间效率的要求&#xff0c;链表通常是用数组模拟成静态链表的形式&#xff0c;速度快。单链表可以用来写邻接表&#xff08;包括n个链表&#xff09;&#xff0c;邻接表可以存储树和…

探索人工智能领域——每日20个名词详解【day11】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

探索Scrapy-spider:构建高效网络爬虫

Spider简介 Scrapy中的Spider是用于定义和执行数据抓取逻辑的核心组件。Spider负责从指定的网站抓取数据&#xff0c;并定义了如何跟踪链接、解析内容以及提取数据的规则。它允许您定制化地指定要抓取的网站、页面和所需的信息。Spider的作用是按照预定的规则爬取网页&#xf…