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

这篇具有很好参考价值的文章主要介绍了【JavaSE】Java基础语法(三十二):Stream流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



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

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流依然可以继续执行其他操作

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

代码演示
Java8 - Stream


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

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

  • 常见方法

【JavaSE】Java基础语法(三十二):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("张无忌");
		
		//需求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) 
    
  • 工具类Collectors提供了具体的收集方式
    【JavaSE】Java基础语法(三十二):Stream流

  • 代码演示

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

【JavaSE】Java基础语法(三十二):Stream流文章来源地址https://www.toymoban.com/news/detail-464676.html

到了这里,关于【JavaSE】Java基础语法(三十二):Stream流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaSE】Java基础语法(三十六):File & IO流

    java.io.File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建、查找和删除等操作。 File:它是文件和目录路径名的抽象表示 文件和目录可以通过File封装成对象 File封装的对象仅仅是一个路径名。它可以是存在的,也可以是不存在的。 | 方法名 | 说明 | | —

    2024年02月07日
    浏览(43)
  • 【JavaSE】Java基础语法(三十七):Java 中的 String 类(源码级别)

    String 表示 字符串类型,属于 引用数据类型 。Java 中 String 是 不可变 的。 在 Java 当中 双引号 括起来的字符串,是直接存储在“方法区”的“字符串常量池”当中的。 源码: 源码: 源码: 源码: 源码: 源码: 源码: 源码: https://blog.csdn.net/qq_44715943/article/details/116308837

    2024年02月06日
    浏览(49)
  • 【JavaSE】Java基础语法(十八):接口

    接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。 Java中接口存在的两个意义 用来定义规范 用来做功能的拓展 接口用interface修饰 类实现接口用implements表示 接口不能实例化 我们可以创建接口的实现类对象使用 接口的子类 要么重写接口中的所有抽

    2024年02月06日
    浏览(58)
  • 【JavaSE】Java基础语法(二十五):异常

    异常的概述 异常就是程序出现了不正常的情况 异常的体系结构 编译时异常 都是Exception类及其子类 必须显示处理,否则程序就会发生错误,无法通过编译 运行时异常 都是RuntimeException类及其子类 无需显示处理,也可以和编译时异常一样处理 图示 如果程序出现了问题,我们

    2024年02月06日
    浏览(46)
  • 【JavaSE】Java基础语法(十六):抽象类

    当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了! 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽 象类! 抽象类和抽象方法必须使用 abstract 修饰 抽象类中不一定有抽

    2024年02月07日
    浏览(54)
  • 【JavaSE】java刷题——基础语法熟练应用

    通过本篇题目,可以让初学Java的小伙伴们更加熟练Java的基础语法~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~  题述:编写程序数一下 1到 100 的所有整数中出现多少个数字9 分两步 取个位上的9  有9 19 29……99 有10个 取十位上的9  有90 91 92 93…

    2024年04月17日
    浏览(46)
  • 【JavaSE】Java基础语法(二十一):内部类

    内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定义格式 格式举例: 内部类的访问特点 内部类可以直接访问外部类的成员,包括私有 外部类要访问内部类的成员,必须创建对象 示例代码: 成员内部类的定义位置 在类中

    2024年02月07日
    浏览(50)
  • 【JavaSE】Java基础语法(十三):Java 中的集合(十分全面)

    List (对付顺序的好帮⼿): 存储的元素是有序的、可重复的。 Set (注重独⼀⽆⼆的性质): 存储的元素是⽆序的、不可重复的。 Queue (实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。 Map (⽤ key 来搜索的专家): 使⽤键值对(key-value)存

    2024年02月10日
    浏览(42)
  • 初始Java篇(JavaSE基础语法)(5)(类和对象(上))

    个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用  类的定义格式 类的实例化 this引用 什么是this引用? this引用的特性 对象的构造及初始化 如何初始化对象(的

    2024年04月08日
    浏览(47)
  • 初始Java篇(JavaSE基础语法)(6)(继承和多态)(上)

                                                            Java学习篇  个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 继承篇  为什么需要继承? 继承概念 继承的语法 父类成员访问 super 子类

    2024年04月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包