java 8--Lambda表达式,Stream流

目录

Lambda表达式

Lambda表达式的由来

Lambda表达式简介

Lambda表达式的结构

Stream流

什么是Stream流?

什么是流呢?

Stream流操作

中间操作

终端操作


Lambda表达式

Lambda表达式的由来

Java是面向对象语言,除了部分简单数据类型,Java中的一切都是对象,即使数组也是一种对象。

在Java中定义的方法不可能完全独立,也不能将方法作为参数或返回一个方法给实例。

在Java8以前,若我们想要把某些功能传递给某个方法,总要去写内部类或匿名内部类。

简而言之,在Java里将普通的方法像参数一样传值并不简单,为此,Java8增加了一个语言级的新特性,名为Lambda表达式。

Lambda表达式简介

Lambda表达式是一个匿名函数,我们可以把lambda表达式理解为一段可以传递的代码(将代码段像数据一样传递)。

Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使java语言的表达式能力得到的提升。

Lambda表达式的结构

  • Lambda表达式可以具有零个,一个或多个参数。
  • 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。例如:(int a,int b)与(a,b)相同。
  • 参数用小括号括起来,用逗号分隔。例如(a,b)或(int a,int b)或(String a,int b,float c)。
  • 空括号用于表示一组空的参数。例如:()->42。
  • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如:a->returna*a
  • Lambda表达式的正文可以包含零条,一条或多条语句。
  • 如果Lambda表达式的正文只有一条语句,则大括号可不用写,且表达式的返回值类型要与匿名函数的返回类型相同。
  • 如果Lambda表达式的正文有一条以上的语句必须包含在大括号(代码块)中,且表达式的返回值类型要与匿名函数的返回类型相同。
import javax.swing.*;
import java.util.ArrayList;public class lambda {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("b");arrayList.add("c");//当排序时,需要定义排序规则//arrayList.sort(new StringComparator());arrayList.sort((a, b) -> {//用Lambda表达式实现return a.compareTo(b);});//匿名内部类, 为了减少类的创建//此处功能核心compareTo方法,但是java是面向对象的,方法是不能独立的存在的,必须将方法包装在对象中/* arrayList.sort(new Comparator<string>(){@Overridepublic int compare(string ol, string o2){return o1.compareTo(o2);}});*/System.out.println(arrayList);//集合遍历arrayList.forEach((e)->{//用Lambda表达式实现System.out.println(e);});}
}

Stream流

什么是Stream流?

Stream是Java8的新特性,它允许你以声明式的方式处理数据集合,可以把它看作是遍历数据集的高级迭代器。

此外与stream与lambada表达示结合后编码效率与大大提高,并且可读性更强。

要澄清的是java8中的stream 与 InputStream 和 OutputStream 是完全不同的概念。

什么是流呢?

 简单的定义,就是“从支持数据处理操作的源,生成的元素序列”。

元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。

数据源:获取数据的源,比如集合。

数据处理操作:流更偏向于数据处理和计算,比如filter、map、find、sort等。

简单来说,我们通过一个集合的stream方法获取一个流,然后对流进行一系列流操作,最后再构建成我们需要的数据集合。

Stream流操作

简单来说就是:

数据源=>中间操作=>终端操作=>结果

1、获取流,把集合/数组转为Stream对象

package De;import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) {//1、将集合转为流ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);Stream<Integer> stream=arrayList.stream();//将集合转为流//2、将数组转为流Integer[] array=new Integer[]{1,2,3,4};Stream<Integer> stream1= Arrays.stream(array);//把数组转为流//3、调用Stream.of方法转为流Stream stream2=Stream.of(1,2,3,4,5);}
}

2、经过流操作

流的操作分为:中间操作: 流的各种数据处理终端操作: 把流转为最终结果(数组/集合/单值)

中间操作

filter:过滤流中的某些元素
sorted():自然排序,流中元素需实现 Comparable 按口
distinct: 去除重复元素
limit(n):获取 n 个元素
skip(n):跳过n元素,配台limit(n)可实现分页
map:将对象中某个属性的值映射到一个新集合中
public static void main(String[] args) {Integer[] array=new Integer[]{1,2,3,4};Arrays.stream(array).skip(1)//跳过指定数量个元素.limit(2)//取出指定数量个元素.forEach((e) ->{System.out.println(e);});System.out.println("------");Arrays.stream(array).filter((e)->{//过滤return e>0;}).sorted((o1, o2) -> {return o2-o1;}).distinct()//去重.forEach((e)->{System.out.println(e);});}

 

终端操作

把流转为最终结果(数组/集合/单值)
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:按收一个 Predicate 函数,只要流中有一个元素满足条件则返true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返true,否则返回 false
findFirst:返回流中第一个元素
package De;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) {Integer[] array=new Integer[]{1,2,3,4,4,5,6};//Min:返回流中元素最小值Integer min=Arrays.stream(array).distinct().min((o1, o2) -> {return o1-o2;}).get();System.out.println(min);//Max:返回流中元素最大值Integer max=Arrays.stream(array).distinct().max((o1, o2) -> {return o1-o2;}).get();System.out.println(max);//count:返回流中元素的总个数long count=Arrays.stream(array).distinct().count();System.out.println(count);//Reduce:所有元素求和long sum=Arrays.stream(array).distinct().reduce((o1, o2) -> {return o1+o2;}).get();System.out.println(sum);//anyMatch:按收一个 Predicate 函数,只要流中有一个元素满足条件则返true,否则返回 falseboolean result1=Arrays.stream(array).distinct().anyMatch((e)->{return e>4;});System.out.println(result1);// allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返true,否则返回 falseboolean result=Arrays.stream(array).distinct().allMatch((e)->{return e>4;});System.out.println(result);//findFirst:返回流中第一个元素Integer res=Arrays.stream(array).distinct().findFirst().get();System.out.println(res);}
}

如果对于一个对象而言,同样也适用。

public class Demo2 {public static void main(String[] args) {student s1=new student(101,"张三",20);student s2=new student(102,"李四",21);student s3=new student(103,"王五",22);student s4=new student(104,"老刘",20);student s5=new student(105,"杨一",24);ArrayList<student> students=new ArrayList<>();students.add(s1);students.add(s2);students.add(s3);students.add(s4);students.add(s5);//sorted():自然排序,流中元素需实现 Comparable 按口List<student> students1=students.stream().sorted((s,y)->{return s.getNum()-y.getNum();}).collect(Collectors.toList());System.out.println(students1);//filter:过滤流中的某些元素List<student> students2=students.stream().filter((s)->{return s.getAge()>22;}).collect(Collectors.toList());System.out.println(students2);// map:将对象中某个属性的值映射到一个新集合中Object[] array1=students.stream().map(student::getNum).toArray();System.out.println(Arrays.toString(array1));//List list=students.stream().map(student::getNum)//)//将对象中某个属性的值映射到一个新集合中.collect(Collectors.toList());System.out.println(list);
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master&#xff08;2C/4G&#xff09; 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02&#xff08;…

2024中青杯数学建模竞赛B题药物属性预测思路代码论文分享

2024年中青杯数学建模竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…

QT调用Tinyxml2库解析XML结构文件

在学习SVG结构的时候&#xff0c;发现SVG结构可以通过以XML文件直接解析&#xff0c;所以就去了解了Tinyxml2库的使用&#xff0c;相关教程也比较多。 个人感觉Tinyxml2库比官方的XML解析库更好用&#xff0c;这里做个技术总结&#xff0c;记录Tinyxml2库解析XML文件结构的简单…

【Linux取经路】一个简单的日志模块

文章目录 一、可变参数的使用二、Log2.1 日志打印2.1.1 时间获取2.1.2 日志分块打印 2.2 打印模式选择2.3 Log 使用样例2.4 Log 完整源码 三、结语 一、可变参数的使用 int sum(int n, ...) {va_list s; // va_list 本质上就是一个指针va_start(s, n); int sum 0;while(n){su…

计算机毕业设计 | node.js(Express)+vue影院售票商城 电影放映购物系统(附源码+论文)

1&#xff0c;绪论 1.1 项目背景 最近几年&#xff0c;我国影院企业发展迅猛&#xff0c;各大电影院不断建设新的院线&#xff0c;每年新投入使用的荧幕数目逐年显著上升。这离不开人们的观影需求及对观影的过程要求的不断进步。广大观影消费者需要知道自己的空闲时间&#x…

Django中使用Celery(通用方案、官方方案)

Django中使用Celery&#xff08;通用方案、官方方案&#xff09; 目录 Django中使用Celery&#xff08;通用方案、官方方案&#xff09;通用方案场景前置准备完整代码 Celery官方方案【1】注册celery配置【2】创建celery文件【3】init注册【4】添加任务【5】启动worker异步任务…

设计模式六大原则之依赖倒置原则

文章目录 概念逻辑关系 小结 概念 依赖倒置原则指在设计代码架构时&#xff0c;高层模块不应该依赖底层模块&#xff0c;二者都应该依赖抽象。抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象。 逻辑关系 如上图所示&#xff0c;逻辑应该就是这样&#xff0c;高层依赖于…

解决Wordpress中Cravatar头像无法访问问题

一、什么是Cravatar Gravatar是WordPress母公司Automattic推出的一个公共头像服务&#xff0c;也是WordPress默认的头像服务。但因为长城防火墙的存在&#xff0c;Gravatar在中国时不时就会被墙一下&#xff0c;比如本次从2021年2月一直到8月都是不可访问状态。 在以往的时候&…

R语言:单细胞pcoa降维和去批次

#生成随机颜色 > randomColor <- function() { paste0("#",paste0(sample(c(0:9, letters[1:6]), 6, replace TRUE),collapse "")) } # 生成100个随机颜色 > randomColors <- replicate(100,randomColor()) > seuratreadRDS("seu…

前端javascript包管理,npm升级用pnpm

一 pnpm 介绍 pnpm&#xff08;Package Manager&#xff09;是一个快速、节省磁盘空间的 JavaScript 包管理器&#xff0c;它是 Node.js 生态系统中 npm 的一个替代品。pnpm 解决了传统包管理工具在处理依赖时的一些痛点&#xff0c;特别是关于存储空间使用和依赖地狱的问题。…

如何将Google Search Console添加到WordPress和GA4

您想知道如何将 Google Search Console 添加到您的 Google Analytics 帐户和 WordPress 网站吗&#xff1f; 作为网站主&#xff0c;Google Search Console 是一款不能不使用的工具。对于任何想要确保其网站在 Google 搜索结果中表现良好的人来说&#xff0c;这绝对是一个必不…

leetCode-hot100-数组专题之区间问题

数组专题之区间问题 知识点&#xff1a;解决思路&#xff1a;例题56.合并区间57.插入区间253.会议室 Ⅱ485.无重叠区间 数组区间问题是算法中常见的一类问题&#xff0c;它们通常涉及对数组中的区间进行排序、合并、插入或删除操作。无论是合并区间、插入区间还是删除重复空间&…

【HarmonyOS尝鲜课】- 下载、安装DevEco Studio以及配置环境、创建运行HarmonyOS项目

下载、安装开发工具 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 这里以Windows为例进行安装&#xff0c;可以根据操作系统选择对应的版本进行下载。 下载完成后解压一下&#xff0c;进入文件里&#xff0c;双击应用程序&#xff0c;打开安装向导&a…

Redis主从、哨兵、集群讲解

一、Redis主从 大家在面试中可能经常会被问到Redis的高可用问题。Redis高可用回答包括两个层面&#xff0c;一个就是数据不能丢失&#xff0c;或者说尽量减少丢失 ;另外一个就是保证Redis服务不中断 。 对于尽量减少数据丢失&#xff0c;可以通过AOF和RDB保证。 对于保证服务…

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…

windows docker desktop 更换镜像存储目录

windows docker desktop 更换镜像存储目录 方法&#xff1a;如图&#xff0c;Browse浏览一个新的目录并选中&#xff0c;确定后&#xff0c;程序会开始stop&#xff0c;在stop完成前&#xff0c;会持续迁移原有镜像到新的位置&#xff0c;你会发现目标位置的磁盘占用空间越来越…

Mac网线连接windows本【局域网互传文件】

Mac网线连接windows本【局域网互传文件】 两台电脑网线互联 Mac->网络->USP TCP/IP 手动配置IP&#xff0c;子网掩码&#xff0c;路由器 windows 网络和Internet配置->更改适配器选项->以太网->Internet协议版本4&#xff08;TCP/IPv4&#xff09;->属性 …

K8S/ hpa分享

在 Kubernetes 中&#xff0c;HorizontalPodAutoscaler 自动更新工作负载资源 &#xff08;例如 Deployment 或者 StatefulSet&#xff09;&#xff0c; 目的是自动扩缩工作负载以满足需求。 hpa的使用本身还是很简单的 示例如下&#xff1a; 官网示例 apiVersion: apps/v1 k…

NetCore发布的时候怎么去除生成的多余的语言文件夹cs,de...,Microsoft.CodeAnalysis语言资源文件

1、问题&#xff1a; .NetCore 3.1 发布出来的publish目录一大堆杂七杂八的文件夹如下图&#xff1a; 2、产生原因 由Microsoft.VisualStudio.Web.CodeGeneration.Design包导致 3、解决方法&#xff1a; 如果确实需要某种语言资源文件&#xff0c;可以这样&#xff0c;右键编…

压摆率SR、增益带宽积GBP、开环增益Aol

运放的选型对运放电路的实际效果非常关键&#xff0c;一定要理解运放重要参数的概念。下面几天将对运放的选型进行系统学习并做实验 运放的压摆率&#xff08;Slew Rate&#xff0c;简称SR&#xff09;是指闭环放大器在输入为阶跃信号时&#xff0c;输出电压时间变化率的平均值…