java 拉姆表达式_Java Lambda表达式与函数式接口

Lambda表达式

1.什么是Lambda表达式:

简洁的表示可以传递的匿名函数的一种方式。

没有名称,但是有参数列表,函数主体,返回类型。

2.Lambda表达式的特性:

匿名:和普通方法不一样,没有一个明确的名字;

函数:Lambda表达式不属于任何一个类;

传递:Lambda表达式可以作为参数(传递给方法,赋值给变量);

简洁:不需要像内部类那样,需要写很多的模板代码。

3.Lambda表达式由三部分构成:

参数列表;

箭头:参数列表和后面的代码块的连接符;

Lambda的主体。

4.Lambda表达式的两种写法:

(参数列表)-> 代码 (默认会有一个return ,代码段的结尾不需要写分号)

(参数列表)-> {代码段;}(代码段的结尾需要写分号)

参数的类型既可以明确声明,也可以根据上下文来推断: (int a)与(a)

当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a

总结:4个特性,3个部分,2种写法

Lambda表达式案例:

(String s)-> s.length()

(Apple a) -> a.getWeight() > 150

(int x , int y) -> { System.out.println("");}

()->42

() -> "helloworld"

测验:下面哪些不是lambda表达式

(1)

()->{}

(2)

() -> "haha"

(3)

() ->{return "haha";}

(4)

(Integer i) -> return i ;

(5)

(String s) -> { s }

答案:(4)(5), (1)是:Runnable()接口中的 void run()

函数式接口:

1.在哪里可以用lambda表达式呢?

在有函数式接口的地方可以使用lambda

2.什么是函数式接口?

大多数的场景下,只有一个抽象方法的接口是函数式接口

//Supplier就是一个函数式接口

public interface Supplier {

T get();

}

//自定义了一个方法,参数是个接口

public static void f3(Supplier supplier){

System.out.println(supplier.get());

}

使用匿名内部类实例化函数式接口的对象:

f3(new Supplier() {

@Override

public String get() {

return "helloworld";

}

}); //模板代码多,有用的就一句return

采用lambda表达式:

f3(

()->"helloworld" //String get()

);

测验:下面哪些不是函数式接口?

(1)

public interface Adder{

int add(int a ,int b);

}

(2)

public interface sAdder extends Adder{

int add(double a ,double b);

}

(3)

public interface Nothing{}

答案:(2)(3) (2里有两个方法,没有重写)

lambda与函数式接口:

@Test

public void test4(){

//lambda表达式 可以看成一个实现了run方法的一个实例对象

Runnable r2 = () -> System.out.println("hellowrold - r2");

//匿名内部类 实例对象

Runnable r1 = new Runnable() {

@Override

public void run() {

System.out.println("hello world");

}

};

// public Thread(Runnable target) //函数式接口

// public abstract void run(); // 参数类型

new Thread(r1).start();

new Thread(r2).start();

}

@FunctionalInterface注解:声明一个接口是一个函数式接口

记忆:加注解的接口里只能有一个“有效”的抽象方法。

网上有很多关于函数式接口的解释严格意义上都不正确,这里纠正下:

函数式接口里面可以有多个抽象方法:编译检查的时候Object抽象方法不会做考虑的。

//有多个抽象方法的函数式接口,下面这个是可以的

@FunctionalInterface

public interface BufferedReaderProcessor{

String process(BufferedReader br);

int hashCode();

boolean equals(Object var1);

}

//用lambda表达式实例化对象

public void test1() {

/**

* 受检异常

* 1.throws

* 2.try catch

*/

BufferedReaderProcessor brf = (BufferedReader br)->br.readLine(); //需要抛出个异常,需要在接口中定义的方法后面抛出

}

@FunctionalInterface

public interface BufferedReaderProcessor{

String process(BufferedReader br) throws IOException;

int hashCode();

boolean equals(Object var1);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值