Java中8的新特性

1、Java8的新特性Lambda

C#   .where(m=>m.id=1)

Java  ->

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。

语法:形参列表 -> 主体部分 ([Type var1 .....])->{ 代码块 }

形参列表:传入主体部分的形参

基本格式:(Type1 var1,Type2 var2,....,TypeN varN) ;以逗号分隔,以()包围

形参类型可推断:如果参数的类型可以根据上下文推断出来,则可以省略掉类型

很多时候形参列表的写法为: (var1,var2,...,varN) ;

单个形参时可以省略 (),例如:e->System.out.println(e);

没有形参参数时,语法格式为:()->主体部分;

->:Lambda表达式的固定写法;

主体部分:

  1. 主体部分可以单个语句或代码块(使用大括号包裹);
  2. 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值

格式示例(无法直接运行):

() -> 1; // 无参数,返回

1 x -> x ; // 1个参数,直接返回

(x, y) -> x – y // 2个参数(数字),并返回他们的差

(int x, int y) -> x + y //2个int型整数,返回和

(String s) -> System.out.print(s) // 一个string参数,并在控制台打印,不返回任何值(看起来像是返回void)

2、函数式接口(Functional Interface)

函数式接口(Functional Interface)是指:一个有且仅有一个抽象方法,但是可以有多个非抽象方法(主要是默认方法和静态方法)的接口

函数式接口可以被隐式转换为Lambda表达式

Java8之前的函数式接口有:

  1. java.lang.Runnable
  2. java.util.concurrent.Callable
  3. java.security.PrivilegedAction
  4. java.util.Comparator
  5. java.io.FileFilter
  6. java.nio.file.PathMatcher
  7. java.lang.reflect.InvocationHandler
  8. java.beans.PropertyChangeListener
  9. java.awt.event.ActionListener
  10. javax.swing.event.ChangeListener

Java8新加的函数式接口(java.util.function包)

分类

接口

等价方法

描述

基础形态

BinaryOperator<T>

代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

Consumer<T>

代表了接受一个输入参数并且无返回的操作

Function<T,R>

接受一个输入参数,返回一个结果。

Predicate<T>

接受一个输入参数,返回一个布尔值结果。

Supplier<T>

无参数,返回一个结果。

双参

BiConsumer<T,U>

代表了一个接受两个输入参数的操作,并且不返回任何结果

BiFunction<T,U,R>

代表了一个接受两个输入参数的方法,并且返回一个结果

BiPredicate<T,U>

代表了一个两个参数的boolean值方法

布尔相关变形

BooleanSupplier

Supplier<Boolean>

代表了boolean值结果的提供方

Double相关变形

DoubleBinaryOperator

BinaryOperator<Double>

代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

DoubleConsumer

Consumer<Double>

代表一个接受double值参数的操作,并且不返回结果。

DoubleFunction<R>

Function<Double,R>

代表接受一个double值参数的方法,并且返回结果

DoublePredicate

Predicate<Double>

代表一个拥有double值参数的boolean值方法

DoubleSupplier

Supplier<Double>

代表一个double值结构的提供方

DoubleToIntFunction

Function<Double,Integer>

接受一个double类型输入,返回一个int类型结果。

DoubleToLongFunction

Function<Double,Long>

接受一个double类型输入,返回一个long类型结果

DoubleUnaryOperator

UnaryOperator<Double>

接受一个参数同为类型double,返回值类型也为double 。

Int相关变形

IntBinaryOperator

BinaryOperator<Integer>

接受两个参数同为类型int,返回值类型也为int 。

IntConsumer

Consumer<Integer>

接受一个int类型的输入参数,无返回值 。

IntFunction<R>

Function<Int,R>

接受一个int类型输入参数,返回一个结果 。

IntPredicate

Predicate<Integer>

接受一个int输入参数,返回一个布尔值的结果。

IntSupplier

Supplier<Integer>

无参数,返回一个int类型结果。

IntUnaryOperator

UnaryOperator<Integer>

接受一个参数同为类型int,返回值类型也为int 。

IntToDoubleFunction

Function<Integer,Double>

接受一个int类型输入,返回一个double类型结果 。

IntToLongFunction

Function<Integer,Long>

接受一个int类型输入,返回一个long类型结果。

Long相关变形

LongBinaryOperator

BinaryOperator<Long>

接受两个参数同为类型long,返回值类型也为long。

LongConsumer

Consumer<Long>

接受一个long类型的输入参数,无返回值。

LongFunction<R>

Function<Long,R>

接受一个long类型输入参数,返回一个结果。

LongPredicate<R>

Predicate<Long>

接受一个long输入参数,返回一个布尔值类型结果。

LongSupplier

Supplier<Long>

无参数,返回一个结果long类型的值。

LongUnaryOperator

UnaryOperator<Long>

接受一个参数同为类型long,返回值类型也为long。

LongToDoubleFunction

Function<Long,Double>

接受一个long类型输入,返回一个double类型结果。

LongToIntFunction

Function<Long,Integer>

接受一个long类型输入,返回一个int类型结果。

Consumer双参变形

ObjDoubleConsumer<T>

BiConsumer<T,Double>

接受一个object类型(泛型T)和一个double类型的输入参数,无返回值。

ObjIntConsumer<T>

BiConsumer<T,Integer>

接受一个object类型(泛型T)和一个int类型的输入参数,无返回值。

ObjLongConsumer<T>

BiConsumer<T,Long>

接受一个object类型(泛型T)和一个long类型的输入参数,无返回值。

转Double相关变形

ToDoubleBiFunction<T,U>

BiFunction<T,U,Double>

接受两个输入参数,返回一个double类型结果

ToDoubleFunction<T>

Function<T,Double>

接受一个输入参数,返回一个double类型结果

转Int相关变形

ToIntBiFunction<T,U>

BiFunction<T,U,Integer>

接受两个输入参数,返回一个int类型结果。

ToIntFunction<T>

Function<T,Integer>

接受一个输入参数,返回一个int类型结果。

转Long相关变形

ToLongBiFunction<T,U>

BiFunction<T,U,Long>

接受两个输入参数,返回一个long类型结果。

ToLongFunction<T>

Function<T,Long>

接受一个输入参数,返回一个long类型结果。

3、接口默认方法和静态方法

Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。

默认方法:默认方法使开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时新加了方法。

默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写。

静态方法: 在接口中可以定义静态方法

4、方法引用

方法引用通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用使用一对冒号 :: 。

有些情况下,用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。

返回值类型

方法名称

说明

Throwable

fillInStackTrace()

在异常堆栈跟踪中填充

Throwable

getCause()

返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null

String

getLocalizedMessage()

创建此 throwable 的本地化描述

String

getMessage()

返回此 throwable 的详细消息字符串

StackTraceElement[]

getStackTrace()

提供编程访问由 printStackTrace() 输出的堆栈跟踪信息

Throwable

initCause(Throwable cause)

将此 throwable 的 cause 初始化为指定值

void

printStackTrace()

将此 throwable 及其追踪输出至标准错误流

以上就是我的分享,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值