java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法

什么是函数编程接口?

约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法。

被@FunctionalInterface注解该接口,没有该注解的接口满足约束也行。

在Java8中,满足下面任意一个条件的接口都是函数式接口:

被@FunctionalInterface注释的接口,满足函数式接口的约束。

没有被@FunctionalInterface注释的接口,但是满足函数式接口的约束。

@函数式的约束:

接口有且只能有个一个抽象方法,只有方法定义,没有方法体。

在接口中覆写Object类中的public方法,不算是函数式接口的方法。

在接口中的default方法,不算是函数式接口的方法。

在接口中的static方法,不算是函数式接口的方法。

自定义一个函数式编程接口

/*** 自定义一个函数式编程接口

* 函数式编程只有一个抽象方法,所以默认的是实现的是这个抽象方法

*@param

*@param*/@FunctionalInterfacepublic interface CalcFunctionInterface{/*** 计算t1和t2

*

*@paramt1

*@paramt2

*@return

*/R calc(T t1, T t2);

}

传入不同calc函数实现的对象,进行调用

相当于以前创建CalcFunctionInterface的匿名类,重写了calc方法(由于只有一个抽象方法,所以默认就是calc方法)

/*** 相当于一个类实现了CalcFunction接口中的唯一一个函数calc

* 然后在利用多态,调用calc函数,传入两个参数,进行计算*/@Testpublic voidadd(){

CalcFunctionInterface add = (t1, t2) -> t1+t2;

Integer calc= add.calc(2, 3);

System.out.println(calc);//5

}

传入一个匿名类对象,进行方法调用calc

@Testpublic voidmultiply(){//相当于通过匿名类的形式传入一个实现了CalcFunctionInterface接口的子类对象,重写了该接口的方法

Integer calc = FunctionalInterfacesTest.calc(2, 3, (t1, t2) -> t1 *t2);

System.out.println(calc);//6

}/*** 接受了一个对象,利用对象的calc方法计算*/

public static Integer calc(Integer i1, Integer i2, CalcFunctionInterfacecalc){returncalc.calc(i1,i2);

}

便捷的引用类的构造器及方法

一个Convert接口

@FunctionalInterfacepublic interface Convert{

T convert(F from);

}

lambda表达式的形式重写该函数式编程的唯一接口

@Testpublic voidtestLambda(){

Convert stringIntegerConvert = (from ->Integer.valueOf(from));

Integer convert= stringIntegerConvert.convert("123");

System.out.println(convert);//123

}

下面使用"::"运算符更精简

静态方法

@Testpublic voidtestStaticMethod(){

Convert stringInstantConvert =Instant::parse;

Instant convert= stringInstantConvert.convert("2019-04-25T16:09:03.852Z");

System.out.println(convert);//2019-04-25T16:09:03.852Z

}

实例方法

/*** 实例对象的方法*/@Testpublic voidtestObjectMethod(){

Something something= newSomething();

Convert startsWith =something::startsWith;

String convert= startsWith.convert("123");

System.out.println(convert);//1

}

classSomething {publicString startsWith(String s) {return String.valueOf(s.charAt(0));

}

}

对象的构造方法

/*** 调用对象的构造方法*/@Testpublic voidtestConstructor(){

PersonFactory personFactory = Person::new;

Person person= personFactory.create("Chris", "Paul");

System.out.println(person);//Person(firstName=Chris, lastName=Paul)

}

/*** Person 工厂*/@FunctionalInterfacepublic interface PersonFactory

{

P create(String firstName, String lastName);

}

@NoArgsConstructor

@AllArgsConstructor

@Getter

@Setter

@ToStringclassPerson {privateString firstName;privateString lastName;

}

Java8的内置函数式编程接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值