系列文章目录
lambda表达式的写法、一些函数式接口,正则表达式的写法与用
目录
一、Lambda表达式
Lambda表达式就是匿名内部类的简写,但是有一个条件,实现的这个接口必须是函数式接口。
Lambda表达式,可以用来表示一个函数,它只关注函数的参数列表, 函数主体、返回类型,并且可以将此函数作为一个参数,进行传递。
1.Lambda表达式语法
()->{ }
():表示参数列表
->:后面跟的是函数主体
{ }:函数主体,表达式的返回值,有这个函数主体中代码来决定
2.注意事项
当方法体只有一行代码,大括号可以省略。
当只有一行return语句,return也能省略。
参数列表的数据类型也可以省略。
Lambda表达式中的参数列表,里面的参数可以不写类型,因为 JVM在运行时会自动推断,当然,如果直接手动写上去,也完全没有问题
3.重载解析
如果出现了方法重载,参数列表中的接口实现类不同,可以使用强转
但是通常情况下不出现这种情况,一般名字重写一个要避免这个问题
二、函数式接口
有且只有一个抽象方法的接口叫做函数式接口,可以使用注解@FunctionalInterface来进行判断是否为一个函数式接口。
常用接口:
Predicate、Consumer、Function、Supplier、UnaryOperator和BinaryOperator等等。
Predicate:
Predicate<T>接口定义了一个test方法,传入一个任意类型,返回一个布尔值
@FunctionalInterfacepublic interface Predicate < T > {boolean test ( T t );}
这个方法通常用来过滤,进行判断
Predicate中还有其他方法:and(),or(),negate()
JDK'1.8之后给 Collection 集合增加了默认方法: removeIf
Consumer:
Consumer<T>接口定义了一个accept方法,传入一个任意类型,没有返回值,相当于是消费者
@FunctionalInterfacepublic interface Consumer < T > {void accept ( T t );default Consumer < T > andThen ( Consumer <? super T > after ) {Objects . requireNonNull ( after );return ( T t ) -> { accept ( t ); after . accept ( t ); };}}
JDK1.8中,给Collection集合增加了默认方法: forEach 用来遍历集合
Supplier:
Supplier<T>接口定义了一个get方法,不传入参数,返回一个任意类型,相当于生产者。
@FunctionalInterfacepublic interface Supplier < T > {T get ();}
Function:
Function<T,R>接口定义了一个apply方法,传入一个任意类型,返回一个任意类型
@FunctionalInterfacepublic interface Function < T , R > {R apply ( T t );default < V > Function < V , R > compose ( Function <? super V , ? extends T > before ) {Objects . requireNonNull ( before );return ( V v ) -> apply ( before . apply ( v ));}default < V > Function < T , V > andThen ( Function <? super R , ? extends V > after ) {Objects . requireNonNull ( after );return ( T t ) -> after . apply ( apply ( t ));}static < T > Function < T , T > identity () {return t -> t ;}}
andThen方法:a.andThen(b),a的结果当成b的参数
compose方法是, 先执行传进来的,在执行外面的。a.compose(b),b的结果作为a的参数。
JDK1.8中,对于Map接口中新增了默认方法: computeIfAbsent ,用来在 指定key不存在时,计算一个value值和指定key匹配,并将该key=value写入 map中。
对于基本数据类型:
对于基本数据类型来说,会进行大量的拆箱装箱,比较消耗性能,JDK1.8之后提供了基本数据类型的函数接口。例如DoublePredicate 、 IntConsumer 、 LongBinaryOperator 、 IntFunction 等。 其中, Function 接口还有针对输出参数类型的变种: ToIntFunction<T> 、 IntToDoubleFunction 等
三、正则表达式
1.作用
作用1:校验字符串是否满足规则
作用2:在一段文本当中查找满足要求的内容
2.规则
字符类:(只能匹配一个字符)
[abc]:只能是a,b,c
[^abc]:除了a,b,c之外的任何字符
[a-zA-Z]:a-z A-Z,包括(头尾范围)相当于闭着的
[a-d[m-p]]:a-d或者m-p
[a-z&&[def]]:a-z和def的交集。为d,e,f
[a-z&&[^bc]]:a-z和非bc的交集。
[a-z&&[^m-p]]:a到z和除了m-p的交集。
预定义字符(只匹配一个字符)
. (点) :任何字符
\d:一个数字 :【0-9】
\D:非数字:[^0-9]
\s:一个空白字符:[\t\n\x0B\f\r]
\S:非空白字符:[^\s]
\w:[a-zA-Z_0-9]英文、数字、下划线
\W:[^\w]:一个非单词字符
这里需要用到转义字符(\)
转义字符就是改变后面原本的含义。把后面的变为普普通通的东西
简单来记:两个\表示一个\
第一个\为转义字符,把后面原本转义的\改为了普普通通的 \
数量词:
这里的X代表任意内容,其实就是上面那些字符和预定义字符
X?: X,一次或0次
X*: X,零次或多次
X+: X,一次或多次
X{n}:X,正好n次
X{n,} X,至少n次
X{n,m} :X,至少n次但不超过m次
3.Java中使用
Java中字符串有一个方法叫做matches方法,将正则表达式传参传入就可以进行判断。