java8笔记:Lambda表达式二

2019-07-04 00:00:00 表达式 笔记 Java8

语法:

例:(Apple a1, Apple a2) -> a1.getWeight()>a2.getWeight()

参数 箭头 主体

1、( ) -> {} //参数为空的void方法,如:public void run(){}

2、( ) -> “Hello” 或 ( ) -> {return “Hello World!”;} //参数为空,返回String。如:public String Hello(){return “Hello World!”;}

3、(String s) -> {“This is ” + s;} //错误 要修改成正确的应该在大括号中添加一个return

4、(String s) -> “This is ” + s //正确

函数式接口:

只定义一个抽象方法的接口,可使用注解@FunctionalInterface帮助我们检测是否满足函数式接口要求

例如:public interface Runnable{ void run( ); }

public interface Callable<V>{ V call( ); }

如之前例子里面定义的接口

public interface ApplePredicate{ boolean test(Apple apple)}

《java8笔记:Lambda表达式二》
《java8笔记:Lambda表达式二》

作用:Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。(具体说来就是:函数式接口的一个具体实现的实例)

用匿名内部类也可以完成同样的事情,只不过比较笨拙。

看个例子:

《java8笔记:Lambda表达式二》
《java8笔记:Lambda表达式二》

类型推断:

java编译器会从上下文(目标类型)推断出用什么函数式接口来配合Lambda表达式。如 List<Apple> greenApple =

filter(appleList, apple -> “green”.equals(apple.getColor()))

局部变量的使用:

同匿名类一样,Lambda表达式是允许使用自由变量的,那么这个变量就得显示的声明为final或者事实上就是final的类型。但是这里还是强调大家谨慎使用

可以认为Lambda是对值封闭,而不是对变量封闭。这种限制存在的原因在于局部变量保存在栈上,也就是它们仅限于其所在的线程使用。如果允许改变局部变量,就会引发造成线程不安全的问题。

局部变量的使用例子:

《java8笔记:Lambda表达式二》
《java8笔记:Lambda表达式二》

这里可以看到我们赋值了两次的变量,在便用的时候就会报错,提示我们,但是如果你包了一层,放在集合里面,我们不改动集合,但是可以改动集合里面的内容。所以这里使用的时候得注意!!!

方法引用:方法引用可以重复使用现有的方法定义,并像lambda一样传递;它就是让你根据已有的方法实现来创建lambda表达式。

使用方式: 目标应用放在分隔符“ :: ”前,方法名称放后面。如Apple::getWeight,

《java8笔记:Lambda表达式二》
《java8笔记:Lambda表达式二》

    原文作者:Looye
    原文地址: https://zhuanlan.zhihu.com/p/32736715
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章