【JavaSE】Java基础语法(三十二):Stream流

简介: 1. 体验Stream流案例需求按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合

1. 体验Stream流

  • 案例需求按照下面的要求完成集合的创建和遍历
  • 创建一个集合,存储多个字符串元素
  • 把集合中所有以"张"开头的元素存储到一个新的集合
  • 把"张"开头的集合中的长度为3的元素存储到一个新的集合
  • 遍历上一步得到的集合
  • 原始方式示例代码
public class StreamDemo {
  public static void main(String[] args) {
  //创建一个集合,存储多个字符串元素
  ArrayList<String> list = new ArrayList<String>();
  list.add("刘亦菲");
  list.add("宋祖儿");
  list.add("林黛玉");
  list.add("江疏影");
  list.add("张敏");
  list.add("张无忌");
  //把集合中所有以"张"开头的元素存储到一个新的集合
  ArrayList<String> zhangList = new ArrayList<String>();
  for(String s : list) {
    if(s.startsWith("张")) {
      zhangList.add(s);
    }
  }
  // System.out.println(zhangList);
  //把"张"开头的集合中的长度为3的元素存储到一个新的集合
  ArrayList<String> threeList = new ArrayList<String>();
  for(String s : zhangList) {
    if(s.length() == 3) {
      threeList.add(s);
    }
  }
  // System.out.println(threeList);
  //遍历上一步得到的集合
  for(String s : threeList) {
    System.out.println(s);
  }
  System.out.println("--------");
  //Stream流来改进
  // list.stream().filter(s -> s.startsWith("张")).filter(s ->
  s.length() == 3).forEach(s -> System.out.println(s));
  list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()
  == 3).forEach(System.out::println);
  }
}


使用Stream流示例代码

public class StreamDemo {
  public static void main(String[] args) {
    //创建一个集合,存储多个字符串元素
    ArrayList<String> list = new ArrayList<String>();
    list.add("刘亦菲");
    list.add("宋祖儿");
    list.add("林黛玉");
    list.add("江疏影");
    list.add("张敏");
    list.add("张无忌");
    //Stream流来改进
    list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()
    == 3).forEach(System.out::println);
    }
}
  • Stream流的好处
  • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度
    为3、逐一打印
  • Stream流把真正的函数式编程风格引入到Java中
  • 代码简洁

2. Stream流的常见生成方式

  • Stream流的三类方法
  • 获取Stream流
  • 创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法
  • 流水线上的操作
  • 一次操作完毕之后,还可以继续进行其他操作
  • 终结方法
  • 一个Stream流只能有一个终结方法
  • 是流水线上的最后一个操作

生成Stream流的方式(获取流)

  • Collection体系集合
  • 使用默认方法stream()生成流, default Stream stream()
  • Map体系集合
  • 把Map转成Set集合,间接的生成流
  • 数组
  • 通过Arrays中的静态方法stream生成流
  • 同种数据类型的多个数据
  • 通过Stream接口的静态方法of(T… values)生成流
  • 代码演示
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);
  }
}

3. Stream流中间操作方法【应用】

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

03430dea9a614c87ac0fb636b092d678.png

代码演示

Java8 - Stream

4. Stream流终结操作方法【应用】

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

cbaf18434a0e4efca6d61b3b76e152eb.png

  • 代码演示
public class StreamDemo {
  public static void main(String[] args) {
    //创建一个集合,存储多个字符串元素
    ArrayList<String> list = new ArrayList<String>();
    list.add("刘亦菲");
    list.add("宋祖儿");
    list.add("林黛玉");
    list.add("江疏影");
    list.add("张敏");
    list.add("张无忌");
    //需求1:把集合中的元素在控制台输出
    // list.stream().forEach(System.out::println);
    //需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
    long count = list.stream().filter(s -> s.startsWith("张")).count();
    System.out.println(count);
  }
}

5. Stream流的收集操作

  • 概念
    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
    Stream流里面不会改变集合数据源中的数据的,需要收集

常用方法

//  把结果收集到集合中
R collect(Collector collector) 

608e439374c248698418e465492bfe8c.png

代码演示

public class CollectDemo {
  public static void main(String[] args) {
    //创建List集合对象
    List<String> list = new ArrayList<String>();
    list.add("刘亦菲");
    list.add("宋祖儿");
    list.add("林黛玉");
    list.add("江疏影");
    /*
    //需求1:得到名字为3个字的流
    Stream<String> listStream = list.stream().filter(s -> s.length() ==
    3);
    //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
    List<String> names = listStream.collect(Collectors.toList());
    for(String name : names) {
    System.out.println(name);
    }
    */
    //创建Set集合对象
    Set<Integer> set = new HashSet<Integer>();
    set.add(10);
    set.add(20);
    set.add(30);
    set.add(33);
    set.add(35);
    /*
    //需求3:得到年龄大于25的流
    Stream<Integer> setStream = set.stream().filter(age -> age > 25);
    //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
    Set<Integer> ages = setStream.collect(Collectors.toSet())
    for(Integer age : ages) {
    System.out.println(age);
    }
    */
    //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
    String[] strArray = {"刘亦菲,30", "宋祖儿,35", "林黛玉,33", "江疏影,25"};
    //需求5:得到字符串中年龄数据大于28的流
    Stream<String> arrayStream = Stream.of(strArray).filter(s ->
    Integer.parseInt(s.split(",")[1]) > 28);
    //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
    Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s ->
    s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
    Set<String> keySet = map.keySet();
    for (String key : keySet) {
      Integer value = map.get(key);
      System.out.println(key + "," + value);
    }
  }
}


相关文章
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
50 1
|
19天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
35 6
|
20天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
20天前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
34 3
|
10天前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
21天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
24 0
|
1月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
31 1
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
30 1
|
存储 算法 Java
Java8语法最佳实践-什么是对象(上)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
165 0
Java8语法最佳实践-什么是对象(上)
下一篇
DataWorks