Lamda表达式
Lamda表达式是JDK1.8引入的重要技术特征,所谓Lamda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用于解决匿名内部类的定义复杂问题。
对于Lamda语法有3种形式:
1.(参数)-> 单行代码;
2.(参数)-> {多行代码};
3.(参数)->表达式。
匿名内部类:
package com.yootk.demo;
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String[] args){
fun(new IMessage(){
@Override
public void print(){
System.out.println("更多课程请访问:www.yootk.com");
}
});
}
public static void fun(IMessage msg){
msg.print();
}
}
程序执行结果:更多课程请访问:www.yootk.com
单行代码:
package com.yootk.demo;
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String[] args){
//此处为Lamda表达式,没有任何输入参数,只是进行参数输出操作
fun(()->System.out.println("更多课程请访问:www.yootk.com“));
}
public static void fun(IMessage msg){
msg.print();
}
}
程序执行结果:更多课程请访问:www.yootk.com
从对比中可以看到,用了lamda表达式后代码变得更加简洁了。
多行代码:
package com.yootk.demo;
@FunctionallInterface
//为了分辨出Lamda表达式的使用接口,可以在接口上使用"@FunctionallInterface"注解声明,
//这样就表示此为函数式接口,里面只允许定义一个抽象方法。
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String[] args){
String info = "魔乐科技软件学院:www.mldn.cn";
fun(() -> {
System.out.println("更多课程请访问:www.yootk.com");
System.out.println(info);//输出方法中的变量
});
}
public static void fun(IMessage msg){
msg.print();
}
}
程序执行结果: 更多课程请访问:www.yootk.com
魔乐科技软件学院:www.mldn.cn
定义有参数有返回值的方法:
package com.yootk.demo;
@FunctionallInerface
interface IMessage{
public int add(int x,int y);
}
public class TestDemo{
public static void main(String[] args){
//此处为Lamda表达式,没有任何输入参数,只是进行参数输出操作
fun((s1,s2) -> {
return s1 + s2;
});
}
public static void fun(IMessage msg){
System.out.println(msg.add(10,20));
}
}
执行结果: 20
方法引用:
在Java中利用对象的引用传递可以实现不同的对象名称操作同一块堆内存空间,而从JDK1.8开始,在方法上也支持了引用操作,这样就相当于定义了别名。对于方法引用,Java一共定义了以下4种操作形式。
1.引用静态方法:类名称 :: static方法名称;
2.引用某个对象的方法:实例化对象 :: 普通方法;
3.引用特定类型的方法:特定类 :: 普通方法;
4.引用构造方法:类名称 :: new;
函数式接口
1.功能型接口(Function)
public interface Function<T,R> {
public R apply(T t);
}
此接口需要接收一个参数,并且返回一个处理结果
package com.yootk.demo;
import java.util.function.Function;
public class TestDemo{
public static void main(String[] args){
Function<String,Boolean> fun = "##yootk" :: startsWith;
System.out.println(fun.apply("##"));//相当于利用对象调用startWith()
}
}
程序执行结果:true
2.消费型接口(Consumer)
public interface Consumer {
public void accept(T t);
}
此接口只是负责接收数据(引用数据时,不需要返回),并且不返回处理结果。
package com.yootk.demo;
import java.util.function.Consumer;
public class TestDemo {
public static void main(String[] args){
Consumer<String> cons = System.out :: print;
cons.accept("更多课程,请访问:www.yootk.com");
}
}
程序执行结果:更多课程,请访问:www.yootk.com
3.供给型接口(Supplier)
public interface Predicate{
public boolean get();
}
此接口不接收参数,但可以返回结果。
package com.yootk.demo;
import java.util.function.Supplier;
public class TestDemo{
public static void main(String[] args){
Supplier<String> sup = "yootk":: toUpperCase;
System.out.println(sup.get());
}
}
程序执行结果:YOOTK
4.断言型接口(Predicate)
public interface Predicate{
public boolean test(T t);
}
进行判断操作使用。
package com.yootk.com.demo;
import java.util.function.Predicate;
public class TestDemo{
public static void main(String[] args){
Predicate<String> pre = "yootk" :: equalsIgnoreCase;
System.out.println(pre.test("YOOTK"));
}
}
程序执行结果:true