java8新特性

JAVA8 新增了很多特性,因为其简便、易懂,已经广泛用于生产环境中,为了不在工作的时候尴尬强烈建议掌握新特性。
主要有以下几点新特性:
1.Lambda表达式 2.函数式接口 3.方法引用 4.构造器引用 5.Stream API 6.Option类 7.DateTime API
本文主要对前5点进行介绍。

1.Lambda表达式

首先来看我们如果要构建一个Runnable接口的实现类会怎么做?很简单,构建一个匿名对象就可以了,匿名对象重写run方法一气呵成。

Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("hello");}
};

那要是想更简单的实现该怎么做呢?这就用到了Lambda表达式,先看示例。

Runnable runnable1=()->{System.out.println("hello");};

是不是有点过于简单了?初次一看,这是啥?为什么跟上面就一样了?下面来介绍一下Lambda表达式的语法:

(parameters) -> expression
或
(parameters) ->{ statements; }

()中填方法的参数,->为Lambda操作符,{}是方法体。

Lambda表达式仅可以作为函数式接口的实现类。

函数式接口:一个接口中仅包含一个方法,这样的接口就被称为函数式接口,比如Runnable接口中只有void run()方法。

现在大概懂了吧,上面的代码由Lambda表达式作为Runnable接口的实现类,所以和上面的代码是等价的。
注意Lambda表达式中的(){}以及参数类型在一定情况都是可以省略的,如参数只有一个时:

public interface Predicate<T> {boolean test(T t);}Predicate<String>s= str->true; 

使用Lambda表达式时,必须非常明确这个函数式接口中的参数和返回值,这样才能写的出来。

2.方法引用

方法引用利用::操作符来指代方法,一般用于配合Lambda表达式使用。
首先看Compartor接口,仅有一个方法compare,符合函数式接口的定义,所以可以用Lambda表达式来替代接口实现类的实现

public interface Comparator<T> {  int compare(T o1, T o2);
}

Lambda实现:

Comparator<Integer>c2=(o1,o2)->o1-o2;

再看看Integer类中compare方法的参数:int compare(int,int),跟Comparator< Interger> 接口中的compare方法参数一样,所以可以用Integer::compare来替换Comparator接口中的compare方法,这就是方法引用。

Comparator<Integer>c=Integer::compare;

特殊情况

方法引用中存在一种特殊情况,接口方法中参数为n个,被引用的方法的类为接口方法的第一个参数,方法仅含有n-1个参数。这种情况也符合方法引用的条件,说起来很抽象,举个例子就懂了。

Compartor< String>中的compare方法: int compare(String o1, String o2);
String的CompareTo方法: public int compareTo(String anotherString);
Lambda表达式:

        Comparator<String>c=String::compareTo;

compare接口方法有2个参数,其中第一个参数为String,而compareTo(String)只有1个参数并且compareTo方法为String类的方法,正好对应接口方法的第一个参数,这样也能实现方法引用。

3.构造器引用

用类名::new来替代返回值为对象的函数式接口。
先看Supplier接口,仅有一个get方法返回对象T。

public interface Supplier<T> {T get();
}

如果用Lambda表示式的话:

class Employee{int a ;Employee(){}Employee(int a){this.a =a;}
}
Supplier<Employee>supplier=()->new Employee();
Supplier<Employee>supplier= Employee::new;

构造器引用还会自动匹配有参构造,当接口函数签名: 对象 (构造器参数…)时会自动匹配

public interface Function<T, R> {R apply(T t);
}
//Functon<Integer,Employee>中存在方法:Employee apply(Integer)Function<Integer,Employee>f =Employee::new;

4.Stream API

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合数组运算和表达的高阶抽象。

Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。

特点

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

多说无益,实例演示:

先将ArrayList中加入了1、2、3共3个元素,再获取ArrayList中的流对象,通过流对象过滤得到集合中>1的元素,并将过滤结果返回成一个新的集合collect。

   ArrayList<Integer> integers = new ArrayList<>();integers.add(1);integers.add(2);integers.add(3);Stream<Integer> stream = integers.stream();List<Integer> collect = stream.filter(i -> i > 1).collect(Collectors.toList());

获取流的方法:

对于Collection集合:
Collection.stream()
Collection.parallelStream()
对于数组:
Arrays.stream(T array) or Stream.of()

流的操作主要分为中间操作、终止操作,中间操作有map映射、filter过滤、limit限制输出等等,终止操作有foreach遍历、match是否匹配、collect收集等等。只有经过终止操作才会得到流的结果。

中间操作 API

map: Stream map(Function<? super T, ? extends R> mapper);

将流中的元素映射(转换)成另外的元素。比如下面将students集合转换成了String集合

List<Student>students;
List<String> studentNames = students.stream().map(Student::getName).collect(Collectors.toList());
Stream filter(Predicate<? super T> predicate);

filter过滤流中的元素,应当传入Predicate接口实现类 方法签名:boolean test(T t)

Stream distinct();

根据对象的hashCode去重

Stream sorted(Comparator<? super T> comparator);

传入Comparator接口实现类排序,也可以不传参数,需要流中的对象实现Comparator接口

ArrayList<Integer> integers = new ArrayList<>();
...
Stream<Integer> stream = integers.stream();
stream.sorted(Integer::compare);
Stream limit(long maxSize);

限制输出多少条结果

students.stream().limit(6).forEach(System.out::println);
Stream skip(long n);

跳过n个元素

终止操作 API

void forEach(Consumer<? super T> action);

遍历流,传入Consumer接口实现类void accept(T t)对流中元素进行操作,一般直接传入System.out::println打印所有元素。

stream.forEach(System.out::println);
A[] toArray(IntFunction<A[]> generator);

可以将流转换成指定的数组,传入对象[]::new

Integer[] array = stream.toArray(Integer[]::new);
max/min

传入Comparator接口实现类返回最大值、最小值,以Optional对象的方式返回,可以通过Option.get()获取。

Optional<T> min(Comparator<? super T> comparator);Optional<T> max(Comparator<? super T> comparator);
long count()

返回流中元素数量

T reduce(T identity, BinaryOperator accumulator);

凝结、归纳流中所有元素,它需要提供一个起始值,然后按一定规则进行运算,比如相加等,它接收一个二元操作 BinaryOperator函数式接口。
重载方法:T reduce(BinaryOperator accumulator); 初始值为0
计算集合中的所有元素之和:

ArrayList<Integer> integers = new ArrayList<>();integers.add(1);integers.add(2);integers.add(3);System.out.println(integers.stream().reduce(0, (v1, v2) -> v1 + v2));//等价于System.out.println(integers.stream().reduce(Integer::sum));
anyMatch\ allMatch\ noneMatch

boolean anyMatch(Predicate<? super T> predicate);

boolean allMatch(Predicate<? super T> predicate);

boolean noneMatch(Predicate<? super T> predicate)
顾名思义,any只要存在就返回true,all所有都符合条件返回true,none都不满足返回true。

<R, A> R collect(Collector<? super T, A, R> collector);

一般用这个方法,还有个重载不常用。
将流中元素转换成集合

List<Integer> = integers.stream().collect(Collectors.toList());

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【响应式布局】

响应式布局 1 什么是响应式布局2 响应式布局的5种实现方案2.1 百分比布局2.2 媒体查询布局2.3 rem响应式布局2.4 vw / vh响应式布局2.5 flex弹性布局 1 什么是响应式布局 响应式布局就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互…

后端配置(宝塔):处理php禁用函数

一、找到php的文件路径 在软件商店中&#xff0c;找到已安装文件&#xff0c;选择需要更改的php文件&#xff0c;选择“设置” 二、选择需要取消禁用的文件进行删除 扩展&#xff1a;可解决 The Process class relies on proc_open, which is not available on your PHP i nst…

Java面向对象高级

文章目录 面向对象高级Object类的常用方法常用方法一&#xff08;面向对象阶段&#xff09;** 和 equals 的区别** 关键字native**单例设计模式&#xff08;Singleton&#xff09;**前情回顾&#xff08;学习基础&#xff09;静态修饰符Static设计模式概念开发步骤**两种实现方…

手把手教你,细说向开源项目递交代码的流程

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 常用GIT命令详解&#xff0c;手把手让你登堂入室 GIT实战篇&#xff0c;教你如何使用GIT可视化工具 GIT使用需知&#xff0c;哪些操作…

信息安全:网络安全漏洞防护技术原理与应用.

信息安全&#xff1a;网络安全漏洞防护技术原理与应用. 网络安全漏洞又称为脆弱性&#xff0c;简称漏洞。漏洞一般是致使网络信息系统安全策略相冲突的缺陷&#xff0c;这种缺陷通常称为安全隐患。 安全漏洞的影响主要有机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可…

UE5 虚幻引擎 使用编辑器工具进行资产批处理操作 让你的工作效率指数级增长!!!

目录 0 引言1 编辑器工具蓝图1.1 介绍1.2 案例&#xff1a;批量设置静态网格体资产的LOD1.3 进阶用法 2 编辑器工具控件2.1 介绍2.2 案例&#xff1a;随机给场景中Actor添加Yaw旋转值 0 引言 官方教程视频 参考文章 参考视频 UE5提供了两种 编辑器工具 &#xff1a;编辑器工具…

【计算机网络】IP协议

目录 前言 IP协议 基本概念 IP协议格式 分片 16位标识 3位标志与13位片偏移 分片流程 网段划分 网络号和主机号 DHCP协议 CIDR划分方案 特殊的ip地址 ip地址数量限制 私有ip地址与公网ip地址 路由转发 前言 我们前面讲了HTTP/HTTPS协议和TCP/…

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 &#xff08;1&#xff09;rect() &#xff08;2&#xff09;strokeRect() &#xff08;3&#xff09;fillRect()和clearRect()函数 3.绘制圆弧 4.…

位图布隆过滤器

文章目录 位图&布隆过滤器1. 位图1.1位图概念1.2位图原理1.3位图实现1.4位图排序 2. 布隆过滤器2.1 引入布隆过滤器2.2 概念2.3 布隆过滤器插入2.4 布隆过滤器的查找2.5 布隆过滤器模拟实现2.6 布隆过滤器的删除2.7 布隆过滤器优缺点2.8 布隆过滤器使用场景 3. 海量数据问题…

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

在我们的零知识赏金 (ZKB) 系列的第二部分中&#xff0c;我们将其应用于解决哈希冲突难题。在这样的谜题中&#xff0c;两个不同的输入散列到相同的输出。此类赏金可用于&#xff1a; 充当煤矿中的金丝雀&#xff0c;给我们一个有价值的提醒。存在冲突是散列函数较弱的标志&…

合合信息、上海大学、华南理工大学发布业内首个古彝文编码“大字典” ,为古文字打造“身份证”

“乌蒙山连着山外山&#xff0c;月光洒向了响水滩。”近期在各大短视频平台爆火的《奢香夫人》你听过吗&#xff1f;奢香夫人是一位彝族“巾帼英雄”&#xff0c;这首同名歌曲早在2009年便已发布&#xff0c;如今突然“翻红”&#xff0c;不仅体现了大众对于少数民族文化高涨的…

Unity可视化Shader工具ASE介绍——1、ASE的介绍、安装和简单使用

大家好&#xff0c;我是阿赵&#xff0c;接下来我打算介绍一下Unity引擎的一个好用的可视化Shader编辑插件。这个插件叫做Amplify Shader Editor&#xff0c;下面都会简称为ASE。这一篇主要是讲一下这个插件的获取、安装&#xff0c;和一些简单的界面用法介绍。之后有机会&…

C语言的stdio.h的介绍

C语言的stdio.h的介绍 C语言的stdio.h的介绍 C语言的stdio.h的介绍C语言stdio.h的介绍 C语言stdio.h的介绍 这个含义是导入标准输入输出库 包含头文件.h&#xff0c;std标准库&#xff0c;io是input output输入输出库 <>代表系统库&#xff0c;自定义的话用""…

C++打印字符串数组中的元素(字符串)

C遍历字符串数组&#xff0c;在main函数里定义一个字符串数组&#xff0c;要求依次输出字符串元素&#xff1a; string a[4] {"a", "vag", "gwe", "gewa"};希望打印的结果 上面可以看做是二维指针&#xff0c;第一维是每个字符串&a…

Springboot 前后端分离项目使用 POI 生成并导出 Excel

在做一个 SpringBoot 前后端分离项目的时候&#xff0c;需要将数据存到 Excel中&#xff0c;用户可以下载 Excel。具体实现是采用 Apache 强大的 POI。文章最后将源码例出。 POI API 文档&#xff1a; https://poi.apache.org/apidocs/dev/index.html 步骤 导入 POI 的 maven …

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录 1、模拟实现qsort函数 1.1、qsort函数的回顾 1.2、模拟实现qsort函数 2、指针和数组笔试题解析 2.1、一维数组 2.2、字符数组 1、模拟实现qsort函数 1.1、qsort函数的回顾 要模拟实现qsort函数&#xff0c;就要了解清楚qsort函数的参数以及使用方式。 我们先回顾一…

vue3 - 封装倒计时函数 useCountDown

编写一个函数 useCountDown 可以把秒数格式化为倒计时的显示状态。 步骤 1. 编写函数框架 ---> 确认参数和返回值&#xff08;显示格式化时间的数据开启倒计时的函数&#xff09; 2. 倒计时的核心逻辑&#xff1a;每隔1s减一 3. 格式化 1&#xff09;安装格式化工具&#xf…

跨域问题的原理及解决方法

一.同源策略 如果没有进行特殊处理&#xff0c;我们在进行前后端联调的时候游览器会发生报错&#xff1a; 这是因为请求被同源策略被阻止&#xff0c;浏览器出于安全的考虑&#xff0c;使用XMLHttpRequest对象发起HTTP请求&#xff08;异步请求&#xff09;时必须遵守同源策略…

单文件制作工具 v7.0.2.38(20230406) 最新版_一个小巧强大的PECMD/7zSFX单文件制作工具

网盘下载 功能描述 —全新的自解压内核&#xff0c;非现有的7zSFX、WinRAR、ZLIB自解压模块&#xff1b; —采用先进的打包方式&#xff08;堪称黑科技—>内核默认PECMD自解压模块&#xff09; —7zSFX模块&#xff0c;创建的单文件支持传递参数&#xff08;包含内置参数和外…

1、MQ基础

微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调用者发起请求后需要等待服务提供者执行业务返回结果后&#xff0c;才能继续执行后面的业务。也就是说调用者在调用过程中处于…