首页 > 编程语言 >小新学Java19-【Stream流、方法引用】

小新学Java19-【Stream流、方法引用】

时间:2022-12-13 20:22:05浏览次数:59  
标签:Stream Java19 元素 流中 接口 新学 引用 方法

一、Stream流

1.1引言

传统集合的多步遍历

代码循环遍历的弊端
Stream的更优写法

1.2流式思想概述

 

 

 

这里的filter 、map 、skip都是在对函数模型进行操作,集合元素并没有真正被处理。只有当终结方法 count执行的时候,整个模型才会按照指定策略执行操作。而这得益于Lambda的延迟执行特性。

备注:"Stream流"”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。

Stream(流)是一个来自数据源的元素队列
✦元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。

数据源:流的来源。可以是集合,数组等。
和以前的Collection操作不同,Stream操作还有两个基础的特征∶
  ✦Pipelining:中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格( fluentstyle )。这样做可以对操作进行优化,比如延迟执行(laziness)和短路( short-circuiting)。
  ✦内部迭代︰以前对集合遍历都是通过lterator或者增强for的方式,显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,流可以直接调用遍历方法。
当使用一个流的时候,通常包括三个基本步骤∶获取一个数据源(source )→数据转换→执行操作获取想要的结果,每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道。

1.3获取流

java.util.stream.Stream<T>是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)
获取一个流非常简单,有以下几种常用的方式:
-所有的Collection集合都可以通过Stream默认方法获取流;
default Stream<E> stream()
-Stream接口的静态方法of可以获取数组对应的流。
static <T> Stream<T> of (T... values)
参数是一个可变参数,那么我们就可以传递一个数组

根据Collection获取流

根据Map获取流

根据数组获取流

1.4常用方法

过滤:filter

Stream流中的常用方法_filter:用于对Stream流中的数据进行过滤
Stream<T> filter( Predicate<? super T> predicate);

filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤

Predicate中的抽象方法:
boolean test(T t);

复习Predicate接口基本使用
统计个数:count

Stream流中的常用方法_count:用于统计stream流中元素的个数
long count( );

count方法是一个终结方法:返回值是一个long类型的整数所以不能再继续调用Stream流中的其他方法了

取用前几个:limit

Stream流中的常用方法_limit:用于截取流中的元素
limit方法可以对流进行截取,只取用前n个。
方法签名:Stream<T> limit(long maxSize);
参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作

limit方法是一个延迟方法,只是对流中的元素进行截取,返回的是一个新的流,所以可以继续调用Stream流中的其他方法

跳过前几个:skip

Stream流中的常用方法_skip:用于跳过元素
如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流:Stream<T> skip(long n);
如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。

映射: map

如果需要将流中的元素映射到另一个流中,可以使用map方法。
<R> Stream<R> map(Function<? super T, ? extends R> mapper );
该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。

Function中的抽象方法:
apply (T t);

复习Function接口基本使用
组合:concat

Stream流中的常用方法_concat:用于把流组合到一起
如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat
static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b)

逐一处理: forEach

Stream流中的常用方法forEach
void forEach(Consumer< ? super T> action);
该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。
Consumer接口是一个消费型的函数式接口,可以传递Lambda表达式,消费数据

简单记:
forEach方法,用来遍历流中的数据
是一个终结方法,遍历之后就不能外继续调用Stream流中的其他方法

1.5练习:

集合元素处理(传统方式)

二、方法引用

2.1冗余的Lambda场景

2.2问题分析

2.3用方法引用改进代码

2.4方法引用符语义分析

推导与省略

2.5通过对象名引用成员方法

通过对象名引用成员方法
使用前提是对象名是已经存在的,成员方法也已经存在
就可以使用对象名来引用成员方法

2.6通过类名称引用静态方法

通过类名引用静态成员方法
类已经存在,静态成员方法也已经存在
就可以通过类名直接引用静态成员方法

2.7通过super引用成员方法

使用super引用类的成员方法super是已经存在的
父类的成员方法sayHello也是已经存在的
所以我们可以直接使用super引用父类的成员方法

2.8通过this引用成员方法

this是已经存在的
本类的成员方法buy也已经存在
所以可以通过this引用本类成员方法

2.9类的构造器引用

2.10数组的构造器引用

标签:Stream,Java19,元素,流中,接口,新学,引用,方法
From: https://www.cnblogs.com/shuxin1125/p/16977064.html

相关文章

  • spark structured streaming (结构化流) join 操作( 官方文档翻译)
    spark结构化流join连接结构化流支持将流dataset/DataFrame与静态dataset/DataFrame,或者另一个流数据集-DataFrame连接起来。流式连接的结果是增量生成的,与流式聚合(str......
  • 小新学Java18-【函数式接口】
    一、函数式接口1.1概念1.2格式1.3@FunctionalInterface注解@FunctionalInterface注解作用:可以检测接口是否是一个函数式接口是:编译成功否:编......
  • 小新学Java17-【网络编程】
    一、网络编程入门1.1软件结构  两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。1.2网络通信协议......
  • 小新学Java16-【缓冲流、转换流、序列化流】
    一、缓冲流1.1概述缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类︰字节缓冲流︰BufferedInputStream,BufferedoutputStream字符......
  • docker search docker images --no-trunc --no-stream
    dockersearchdockerimages--no-trunc--no-streamdenied:requestedaccesstotheresourceisdenieddocker上传镜像命名tag时需要匹配 仓库名 docker search......
  • docker image inspect image:tag docker stats --no-stream
    dockerstatsnginx--no-stream--format"{{json.}}"[root@localhost12-7]#dockerimageinspectnew_img:v1|grep"qinrui""whiletrue;doecho......
  • springcloud Stream消息驱动
    SpringCloudStream是⼀个构建消息驱动微服务的框架。应⽤程序通过inputs(相当于消息消费者consumer)或者outputs(相当于消息⽣产者producer)来与SpringCloudStream中的bind......
  • Stream流之其他使用
    数组:packagecom.Lucky;importjava.util.*;/*数组的Stream流:使用Arrays工具类*/publicclassStreamArray{publicstaticvoidmain(String[]args)......
  • Stream流之综合练习
    packagecom.Lucky.test;importjava.util.*;importjava.util.stream.Collectors;importjava.util.stream.Stream;/***练习1:数据过滤,定义一个Int类型的集合,过......
  • Stream【数据流】的基本使用
    Stream:数据流中间方法:filter【过滤】limit【获取前几个数据】skip【跳过前几个数据】distinct【去重】concat【合并】map【......