Nutshell中的Java 8语言功能-第2部分

编者注:您也可以在此处检查Part-1。

嗨,朋友们,这是简明系列的Java 8语言功能的第2部分。

在这里,我们将讨论Java 8的以下功能:

  1. 接口中的静态方法

Java 8徽标

1.接口中的静态方法

什么是静态方法?

静态方法是属于类而不是对象或实例的方法。 换句话说,这意味着该类的所有实例共享在静态方法中定义的相同行为。 因此,您无需创建Class的实例或对象即可调用静态方法。

因此,如果静态方法不需要调用对象,则将它们放在类中就没有多大意义,因为类是属于该类的所有对象的蓝图。 那么如果我们可以将所有静态方法放在接口而不是类中呢? 好消息是,Java 8允许这样做。 使用Java 8,我们可以将以前用来放置类的实用程序方法放入接口中。

接口中静态方法的语法

语法与其他任何静态方法一样。

static <Return Type> <Method Name>();

接口中静态方法的主要目的

允许在接口中添加静态方法的主要原因是在接口中而不是在类中具有实用程序方法。 在Java 8之前,如果我们要定义一些实用程序方法,那么我们将创建一个类并在该类中定义实用程序方法,因为我们知道创建仅包含实用程序方法的类的对象是没有意义的,因此我们正在构造构造函数该类的名称为Private,并将该类标记为final,以使其无法继承,因为我们知道静态方法不会被继承,因此最好将其显式标记,以便仅查看该类就可以知道类不能被继承。

接口中的静态方法示例

在Java 8之前

final class CustomerUtil {private CustomerUtil(){}public static Date convertDateFormat(){}public static String appendData() {}
}
class Test {public static void main(String[] args){CustomerUtil.convertDateFormat();  }
}

Java 8之后

interface CustomerUtil {public static Date convertDateFormat(){}public static String appendData() {}
}
class Test {
public static void main(String[] args){CustomerUtil.convertDateFormat();  }
}

2.流

Java 8中的Stream是什么

流是源中支持聚合操作的一系列元素。 因此,每个流将有一个源和一个目的地。 数据通过Stream从源流向目标。

下面的Oracle文档摘录很好地描述了Collection和Stream之间的区别。

Java 8源流目标

  • 没有存储 。 流不是存储元素的数据结构。 相反,它通过一系列计算操作从数据结构,数组,生成器功能或I / O通道等源中传递元素。
  • 本质上是功能性的 。 对流的操作会产生结果,但不会修改其源。 例如,一种过滤Stream获得从集合产生一个新的Stream ,而不过滤元件,而不是删除从源收集元件。
  • 懒惰 。 许多流操作(例如过滤,映射或重复删除)可以延迟实施,从而暴露出进行优化的机会。 例如,“使用三个连续的元音查找第一个String ”不需要检查所有输入字符串。 流操作分为中间( Stream )操作和终端(产生值或副作用)操作。 中间操作总是很懒。
  • 可能是无限的 。 尽管集合的大小是有限的,但流不是必需的。 诸如limit(n)findFirst()类的短路操作可以允许对无限流的计算在有限时间内完成。
  • 易耗品 。 在流的生存期内,流的元素只能访问一次。 像Iterator一样,必须生成新的流以重新访问源中的相同元素

Stream的语法

流可以通过多种方式创建。 我们将看到最常用的一种方法,并在另一篇文章中讨论其他方法。

流的Java 8语法

从上图可以看出,在Collection接口中添加了新的默认方法stream() ,并且List,Set和Queue接口扩展了Collection接口,因此所有这些接口都具有stream方法,该方法可以用于从这些集合中创建Stream作为源。

使用列表作为源创建字符串流的语法

List<String> list = new ArrayList<>();
list.add("AA");Stream<String> stream = list.stream();

创建以Set为源的字符串流的语法

Set<String> set = new HashSet<>();
set.add("AA");Stream<String> stream = set.stream();

流的主要目的

在Java中引入Stream API的主要目的是减少冗长的代码来对诸如Collections,Array之类的一组数据执行操作,并利用多核处理器(使用并行流)而无需程序员编写一行多线程代码,从而提高了性能。

流操作示例

假设您有一个元素列表(字符串),并且想要一个不同的元素列表。 接下来,我们将看到您将如何在Java 8之前和Java 8上做到这一点。

在Java 8之前

List<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("BB");
list.add("BB");
System.out.println("Size of list before applying distinct logic:"+list.size());
List<String> distinctList1 = new ArrayList<String>();
for(String str : list){if(!distinctList1.contains(str)){distinctList1.add(str);}
}
System.out.println("Distinct List Size:"+ distinctList1.size());

Java 8之后

List<String> sourceList = new ArrayList<>();
sourceList.add("AA");
sourceList.add("BB");
sourceList.add("BB");
sourceList.add("BB");
System.out.println("Size of list before applying Stream Operations:"+sourceList.size());
List<String> distinctList =  sourceList.stream().distinct().collect(Collectors.toList());
System.out.println("Distinct List Size:"+ distinctList.size());

在上面的代码中, sourceListStream distinct()的元素源, Stream distinct()collect()是流操作。 distinctList是destinition列表。

从上面的示例可以看出,使用Java 8,可对Collection进行操作的代码更像是查询,而不是很多样板代码。 就像在SQL中一样,我们不需要编写逻辑来从elements.Sql集合中查找最大值,而Sql为此提供了max()函数。 同样,Java 8流提供了许多聚合函数,我们也可以将它们链接在一起以在一行中完成多项操作。 这种方法的优点是该代码不太冗长,并且还利用了多核处理器,因此也提高了性能。

参考文献:

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html

翻译自: https://www.javacodegeeks.com/2018/07/java-8-language-features-part-2.html

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

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

相关文章

梯度下降法、最速下降法

梯度下降法 最优化问题是求解函数极值的问题&#xff0c;包括极大值和极小值。相信所有的读者对这个问题都不陌生&#xff0c;在初中时我们就学会了求解二次函数的极值&#xff08;抛物线的顶点&#xff09;&#xff0c;高中时学习了幂函数&#xff0c;指数函数&#xff0c;对…

超越函数

代数数 在数论中&#xff0c;超越数是指任何一个不是代数数的数字&#xff08;通常它是复数&#xff09;。它满足以下条件——只要它不是任何一个整系数代数方程的根&#xff0c;它即是超越数。最著名的超越数是e以及π。 超越数 超越数的例子 所有超越数构成的集是一个不可数…

只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

这是一个分为两部分的系列&#xff0c;其中我将展示如何使用Spring Boot创建分层架构。 什么是分层体系结构&#xff1a;简而言之&#xff0c;当我们构建企业应用程序时&#xff0c;我们维护不同的层以封装特定于层的逻辑&#xff0c;这样就不会溢出到另一层。 当我们考虑企业…

linux设置默认的首页文件,Linux 设置Firefox主页

Linux 设置Firefox主页在Linux系统中&#xff0c;当用户启动Firefox主页时&#xff0c;会自动打开Firefox默认设置的主页。当然&#xff0c;用户也可以通过Firefox的首选项&#xff0c;手动将Firefox主页设置为自己喜欢的或经常访问的网页。在本单元练习中&#xff0c;将Firefo…

向量范数与矩阵范数

一、向量的范数 1.1 定义 1.2 举例 首先定义一个向量为&#xff1a;a[-5&#xff0c;6&#xff0c;8, -10] 1.2.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&…

苹果linux桌面文件夹,Ubuntu 10.04下一键安装Mac OS X主题桌面

不久前的《Ubuntu 10.04下Mac OS X风格桌面美化安装》遭到网友的砖头&#xff0c;认为和Mac OS X风格桌面美化安装根本没有关系。本来是要跟这篇一起发布的&#xff0c;一等就等了这么长&#xff0c;下面我们来看下在Ubuntu 10.04下一键安装Mac OS X主题桌面的工具Epidermis th…

示性函数、共轭函数、对偶范数、共轭

示性函数(Indicator function) 共轭函数 对偶范数 几个常用公式 共轭&#xff08;conjugate&#xff09; 所谓“轭”&#xff0c;指的是古代牛车上放在并行的牛脖颈上的曲木。共轭关系&#xff0c;通俗来说一般用以描述两件事物以一定规律相互配对或孪生&#xff08;一般共轭对…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

MicroProfile OpenAPI上的Swagger UI

MicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger-annotations &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&…

linux 跟踪内存,用strace跟踪malloc内存分配

strace介绍strace是一个非常有用的命令&#xff0c;它用于记录和跟踪程序运行期间收到的信号和调用的系统调用。strace的简单使用ubuntu64:~$ strace cat /dev/nullexecve("/bin/cat", ["cat", "/dev/null"], [/* 32 vars */]) 0brk(NULL) 0x1…

归一化、标准化和正则化

归一化 Normalization 归一化一般是将数据映射到指定的范围&#xff0c;用于去除不同维度数据的量纲以及量纲单位。 常见的映射范围有 [0, 1] 和 [-1, 1] &#xff0c;最常见的归一化方法就是 Min-Max 归一化&#xff1a; 举个例子&#xff0c;我们判断一个人的身体状况是否健…

slf4j绑定器_用于ADFLogger的SLF4J绑定–缺少的部分

slf4j绑定器由于最好的原因&#xff0c;在我的日常工作中&#xff0c;我希望为ADF Logger Oracle ADF提供一个SLF4J适配器。 毫不奇怪&#xff0c;slf4j没有用于ADFLogger的适配器&#xff0c;但是由于ADFLogger只是Java Util Logging的轻巧包装&#xff0c;因此花了一个多小时…

核心网

在我们正式讲解之前&#xff0c;我想通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧…

JDK 11:轻松取出单文件Java源代码程序

JDK 11 Early Access Builds包含与JEP 330相关的预览功能&#xff08;“启动单个文件源代码程序”&#xff09;。 我之前在“ Shebang即将来到Java&#xff1f; ”和“ 为JDK 11提议的JEP 329和JEP 330 ”&#xff0c;由于JDK 11 Early Access Builds&#xff0c;在这篇文章中…

瑞利、莱斯与Nakagami-m信道衰落模型

一、信道的定义与调制信道的数学模型 1.信道的定义与分类 信道&#xff08;Channel&#xff09;是指以传输媒质为基础的信号通道。根据新到的定义&#xff0c;如果信道仅是指信号的传输媒质&#xff0c;这种信道称为狭义信道&#xff1b;如果这种信道不仅是传输媒质&#xff…

linux用if语句编程序,Shell 脚本基础 - 使用 if 语句进行条件检测

Bourne Shell 的 if 语句和大部分编程语言一样 - 检测条件是否真实&#xff0c;如果条件为真&#xff0c;shell 会执行这个 if 语句指定的代码块&#xff0c;如果条件为假&#xff0c;shell 就会跳过 if 代码块&#xff0c;继续执行之后的代码。if 语句的语法&#xff1a;if[判…

卫星导航定位 -- 坐标系统与时间系统

原文https://blog.csdn.net/f2157120/article/details/81210843 1 协议天球坐标系 以地球质心为坐标原点&#xff0c;以地球自转的轴为z轴 2 协议地球坐标系 3 WGS-84坐标系 4 CGS2000坐标系统 5 直角坐标系与大地坐标系转换 6 大地坐标系转换 7 时间系统 8 GNSS时间系统 …

博弈论学科整体概览

一、博弈论的概念 博弈论又被称为对策论&#xff08;Game Theory&#xff09;既是现代数学的一个新分支&#xff0c;也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行…

linux 进程组id 错乱,【Linux】终端,进程组,作业,会话及作业控制

终端概念在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况 下(没有重定向)…