【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);
    }
  }
}


相关文章
|
4天前
|
安全 Java API
Java Stream API详解与使用
Java Stream API是Java 8引入的特性,提供函数式操作处理集合,支持链式操作和并行处理,提升代码可读性和性能。关键点包括:延迟执行的中间操作(如filter, map)和触发计算的终端操作(如collect, forEach)。示例展示了如何从Person列表过滤出年龄大于20的姓名并排序。使用Stream时注意避免中间操作的副作用,终端操作后Stream不能复用,以及并行操作的线程安全性。
12 1
|
1天前
|
安全 Java API
Java进阶-Java Stream API详解与使用
效、更易于维护的代码,同时享受到函数式编程带来的好处。
9 2
|
2天前
|
Java 大数据 API
利用Java Stream API实现高效数据处理
在大数据和云计算时代,数据处理效率成为了软件开发者必须面对的重要挑战。Java 8及以后版本引入的Stream API为开发者提供了一种声明式、函数式的数据处理方式,极大提升了数据处理的效率和可读性。本文将详细介绍Java Stream API的基本概念、使用方法和性能优势,并通过实际案例展示如何在实际项目中应用Stream API实现高效数据处理。
|
2天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
24 7
|
2天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
7 0
|
2天前
|
Java
Java8 Stream 用法合集
Java8 Stream 用法合集
|
4天前
|
Java API
Java 8新特性之Lambda表达式与Stream API实践指南
【5月更文挑战第15天】 随着Java语言的不断发展,Java 8作为一个重要的版本,引入了许多令人兴奋的新特性。其中,Lambda表达式和Stream API是Java 8最受关注的两个特性。本文将深入探讨Lambda表达式的基本概念、语法和使用场景,以及如何结合Stream API实现更加简洁、高效的代码编写。通过实例演示,帮助读者快速掌握这两个新特性,提高Java编程能力。
|
4天前
|
Java API 数据处理
Java一分钟之-Stream API:数据处理新方式
【5月更文挑战第13天】Java 8的Stream API为集合操作提供了声明式编程,简化数据处理。本文介绍了Stream的基本概念、常见问题和易错点。问题包括并行流与顺序流的区别,状态改变操作的影响,以及忘记调用终止操作和误用`peek()`。理解并合理使用Stream API能提升代码效率和可维护性。实践中不断探索,将发掘更多Stream API的潜力。
12 3
|
4天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
43 2
|
4天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
10 0