1.Lambda
(1)Java 8 Lambda 表达式
在 Java 8 以前,若我们想要把某些功能传递给某个方法,总要去写内部类
或匿名内部类类。代码示例:
list.sort(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getId()-o2.getId();
}
}
在上面的例子里,为了对集合集合进行排序,我们为
Comparator
接口创建 了一个它的匿名内部类对象,重写接口中的方法,来实现排序功能. 简而言之,在 Java 里将普通的方法像参数一样传值并不简单,为此,Java 8 增加了一个语言级的新特性,名为 Lambda 表达式。
(2)Lambda 表达式简介
Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解为一段 可以传递的代码(将代码段像数据一样传递)。使用它可以写出更简洁, 更灵
活的代码。作为一种更紧凑的代码风格,使 java 语言的表达式能力得到的提升。
Lambda 表达式的本质只是一个
"语法糖"
,由编译器推断并帮你转换包装为
常规的代码,因此你可以使用更少的代码来实现同样的功能。
(3)Lambda 表达式的结构
Lambda 表达式可以具有零个,一个或多个参数。 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。 例如 (int a,int b)与 (a,b)相同。
参数用小括号括起来,用逗号分隔。例如 (a, b) 或 (int a, int b) 或 (String a, int b, float c)。
空括号用于表示一组空的参数。例如 () -> 42。
当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。
例如 a -> return a*a。
Lambda 表达式的正文可以包含零条,一条或多条语句。
如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式
的返回值类型要与匿名函数的返回类型相同。
如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)
中,且表达式的返回值类型要与匿名函数的返回类型相同。
Java 中的 Lambda 表达式通常使用 (argument) -> {body}语法书写,例如:
左侧:lambda 表达式的参数列表
右侧:lambda 表达式中需要执行的功能,即 lambda 体
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }
以下是一些 Lambda 表达式的例子:
无参数,无返回值,lambda 体中只有一行代码时,{}可以忽略
() -> System.out.println("Hello World");
无参数,有返回值
() -> { return 3.1415 };
有参数,无返回值
(String s) -> { System.out.println(s); }
有一个参数,无返回值
s -> { System.out.println(s); }
有多个参数,有返回值
(int a, int b) -> { return a + b; }
有多个参数,表达式参数类型可以不写,jvm 可以根据上下文进行类型推断
(a, b) -> { return a - b; }
(4)什么是功能接口(Functional interface)
Lambda 表达式只支持函数式接口 也就是只有一个抽象方法的接口.功能 接口是 java 8 中的新增功能,它们只允许一个抽象方法。这些接口也称为单抽 象方法接口。Java 8 也引入了一个注释,即@FunctionalInterface,当你注释 的接口违反了 Functional Interface 的契约时,它可以用于编译器级错误。
以下是自定义功能接口的示例:
@FunctionalInterface
public interface WorkerInterface {
public void doSomeWork();
}
正如其定义所述,功能接口只能有一个抽象方法。如果我们尝试在其中添加一个
抽象方法,则会抛出编译时错误。例如:
@FunctionalInterface
public interface WorkerInterface {
public void doWork();
public void doMoreWork();}
2.Java8Stream
(1)什么是 Stream?
Stream 是 Java8 的新特性,它允许你以声明式的方式处理数据集合,可以把
它看作是遍历数据集的高级迭代器。此外与 stream 与 lambada 表达示结合后
编码效率与大大提高,并且可读性更强。
要澄清的是 java8 中的 stream 与 InputStream 和 OutputStream 是完全
不同的概念.
简单案例:
public static void main(String[] args) {
List<Apple> applestore = new ArrayList();
applestore.add(new Apple(1,"red",500,"河南"));
applestore.add(new Apple(2,"red",400,"陕西"));
applestore.add(new Apple(3,"green",300,"上海"));
applestore.add(new Apple(4,"green",200,"湖北"));
applestore.add(new Apple(5,"green",100,"湖南"));
}
我们的需求是在 applestore 集合中找出红色苹果手机.
使用 Stream 流快速实现操作
List<Apple> apples = applestore
.stream()
.filter(a -> a.getColor().equals("red"))
.collect(Collectors.toList());
这里使用的就是 Java8 中的 stream 流,使用的是声明性方式写的:说明想
要完成什么(筛选,排序,取值),而不说明如何实现一个操作(for 循环)。
同时可以将这些操作链接起来,达到一种流水线式的效果:
Java8 中的集合支持一个新的 Stream 方法,它会返回一个流。
(2)什么是流?
简单的定义,就是“从支持数据处理操作的源,生成的元素序列”。
元素列表:
和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。
数据源 :
获取数据的源,比如集合。
数据处理操作 :
流更偏向于数据处理和计算,比如 filter、map、find、sort 等。
简单来说,我们通过一个集合的 stream 方法获取一个流,然后对流进行一
系列流操作,最后再构建成我们需要的数据集合。
语法:
stream of elements
+-----> |
filter
+-> |
sorted
+-> |
map
+-> |
collect
|+
List
<
Integer
>
list
=
widgets
.
stream
()
.
filter
(
b
->
b
.
getColor
() ==
RED
)
.
sorted
((
x
,
y
) ->
x
.
getWeight
() -
y
.
getWeight
())
.
sum
();
获取流
使用 Collection 接口下的 stream()
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
使用 Arrays 中的 stream() 方法,将数组转成流
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
使用 Stream 中的静态方法:of()
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
使用 BufferedReader.lines() 方法,将每行内容转成流
BufferedReader reader=new BufferedReader(new FileReader("stream.txt"));
Stream<String> lineStream = reader.lines();
流操作
流操作可以分为两类:
中间操作
和
终端操作
。回看之前的代码:
List<Apple> apples = applestore
.stream()
获得流
.filter(a -> a.getColor().equals("red"))
中间操作
.collect(Collectors.toList());
终端操作
简化一下就是:
数据源 => 中间操作 => 终端操作 => 结果
诸如 filter 或者 sort 等中间操作会返回另一个流,进而进行下一步流操作,而终
端操作则是将流关闭,构建新的数据集合对象(也可以不构建)。
中间操作
filter:过滤流中的某些元素,
sorted(): 自然排序,流中元素需实现 Comparable 接口
distinct: 去除重复元素
limit(n): 获取 n 个元素
skip(n): 跳过 n 元素,配合 limit(n)可实现分页
map(): 将其映射成一个新的元素
终端操作
forEach: 遍历流中的元素
toArray:将流中的元素倒入一个数组
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返
回 true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返
回 true,否则返回 false
findFirst:返回流中第一个元素
collect:将流中的元素倒入一个集合,Collection 或 Map
3.Maven
(1)Maven简介
Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它
用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、
测试、打包和发布等工作。
(2)概念
pom(Project Object Model 项目对象模型)
Maven 管理的项目的根目录下都有一个 pom.xml 文件。
pom.xml 文件指示 Maven 如何工作。
在 pom.xml 文件中配置项目基本信息以及项目构建信息等。比如:项目坐标、
项目依赖的 jar、插件、编译选项等。
一旦在 pom.xml 文件中配置了所依赖的 jar,Maven 会自动从构件仓库中下
载相应的构件。
坐标
Maven 给每个 jar 定义了唯一的标志,这个在 Maven 中叫做项目的坐标,通
过这个坐标可以找到你需要 用到的任何版本的 jar 包。
groupId、artifactId、packaging、version 的组合被称为项目的坐标,它们形
成了项目的唯一标识,Maven 通过坐标来精确定位构件。其中 groupId、
artifactId、version 是必须的,且这三项的值必须唯一,packaging 是可选的(默
认为 jar)。
仓库
中央仓库全球共享,先将 jar 从中央仓库下载到本地仓库,然后在项目中引用本地
仓库的 jar.
(3)Maven 开发环境搭建:
1. 前提
安装 jdk
Maven 工作时需要通过网络下载各种插件以完成任务,因此应保证网络的通
畅
2.下载 Maven 服务器
Maven 官网:http:// maven .apache. org
点击 download 进行下载如下图
3.安装,配置 Maven
点击下载二进制的 apache-maven -3.6.0-bin.zip 进行解压,”然后在系统环境
中配置环境变量,在path中配置到bin目录,配置成功后输入命令mvn -version
查看版本如下图:
表示 Maven 环境配置成功。
配置本地仓库地址
接下来根据情况在本地磁盘中建立通过 Maven 下载后 jar 文件所存储的文件
夹,一般我们称为”仓库(repository)”;最终是如何将下载的 jar 文件存储到我
们指定的仓库中呢?需要在 Maven 的服务器解压的文件中找到 conf 文件夹下
的 settings.xml 文件进行修改,如下图所示:
配置阿里云 Maven 镜像仓库,下载速度更快
<mirror>
<id>aliMaven </id>
<name>aliyun Maven </name>
<url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4.idea 中设置 Maven
5.创建 Maven 工程
6.
pom.xml
配置
pom.xml 文件基本结构
1.项目基本信息
<
modelVersion
>4.0.0</
modelVersion
>
<
groupId
>org.example</
groupId
>
<
artifactId
>test</
artifactId
>
<
version
>1.0-SNAPSHOT</
version
>
2. 指定编译时使用的 jdk 版本
<
properties
>
<
maven.compiler.source
>1.8</
maven.compiler.source
>
<!-- 设置 Java 源代码兼容性 -->
<
maven.compiler.target
>1.8</
maven.compiler.target
>
<!-- 设置编译的目标 JVM 版本 -->
</
properties
>
3. 依赖信息
<
dependencies
>
<!--mysql-->
<
dependency
>
<
groupId
>mysql</
groupId
>
<
artifactId
>mysql-connector-java</
artifactId
>
<
version
>8.0.16</
version
>
</
dependency
>
</
dependencies
>
Maven 仓库官网(http://mvnrepository.com/)如下图所示:
在此官网就可以下载自己所需开发 jar 包,继续点击链接打开如下:
4. 构建信息
<
build
>...</
build
>
7.Maven命令
Maven 常用命令
1. clean
删除编译的 target
2. compile 编译
3. package 打包
8.添加打包依赖
<
build
>
<
plugins
>
<
plugin
>
<
groupId
>org.apache.maven.plugins</
groupId
>
<
artifactId
>maven-assembly-plugin</
artifactId
>
<
configuration
>
<
descriptorRefs
>
<!--
给
jar
包起的别名
-->
<
descriptorRef
>jar-with-dependencies</
descriptorRef
>
</
descriptorRefs
>
<
archive
>
<
manifest
>
<
addClasspath
>true</
addClasspath
>
<
classpathPrefix
>lib/</
classpathPrefix
>
<!--
添加项目中主类
-->
<
mainClass
>com.ffyc.chatrom.client.frame.Run</
mainClass
>
</
manifest
>
</
archive
>
</
configuration
>
<
executions
>
<
execution
>
<
id
>make-assembly</
id
>
<
phase
>package</
phase
>
<
goals
>
<
goal
>single</
goal
>
</
goals
>
</
execution
>
</
executions
>
</
plugin
>
</
plugins
>
</
build
>
执行 maven 命令
复制出 jar 包,到桌面. 命令行进入到桌面
java -jar jar 包名称