美文网首页
【JAVA基础】Lambda

【JAVA基础】Lambda

作者: 嘻洋洋 | 来源:发表于2019-08-20 15:31 被阅读0次

1. Lambda基础

lambda表达式允许你通过表达式来代替功能接口。Lambda表达式的本质只是一个"语法糖"。

1.1. Lambda组成

由三个部分组成

  • 第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数。
  • 第二部分为一个箭头符号:->。
  • 第三部分为方法体,可以是表达式和代码块。
parameters) -> expression
(int a,int b) -> return a + b; //求和

(parameters) -> { statements; }
(int a) -> {System.out.println("a = " + a);} //打印,无返回值
(int a) -> {return a * a;} //求平方

1.2. 函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。划重点:函数式接口可以被隐式转换为 lambda 表达式。函数式接口的定义,如:

//@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。就像加入@Override标注会检查是否重载了函数一样
@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现:

GreetingService greetService1 = message -> System.out.println("Hello " + message);

确定了某个interface是用于Lambda表达式,请一定要加上@FunctionalInterface,防止他人增加另外一个抽像方法。
1.3. 双冒号操作符
双冒号运算方法引用,格式:类名::方法名。一般是用作Lambda表达式。
表达式person -> person.getName(); 替换成:Person::getName
表达式() -> new HashMap<>();替换成:HashMap::new

2.Lambda应用

2.1.Lambda和匿名内部类

Lambda表达式可以简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数式接口(Functional Interface)的简写(接口名和函数名都简写掉了)。例如:

// JDK7 匿名内部类写法
new Thread(new Runnable(){// 接口名
    @Override
    public void run(){// 方法名
        System.out.println("Thread run()");
    }
}).start();
// JDK8 Lambda表达式写法
new Thread(
        () -> System.out.println("Thread run()")// 省略接口名和方法名
).start();
//简写new Runnable(){}
Runnable run = () -> System.out.println("Hello World");// 1

需要注意:在匿名内部类中this指的是自身的引用,在Lambda表达式中this指的是外部。

2.2. 用内部迭代取代外部迭代

有时候代码里嵌套2个以上的for循环的都比较难读懂,使用内部迭代进行简化。

String[] atp = {"Rafael Nadal", "Novak Djokovic",  
       "Stanislas Wawrinka",  
       "David Ferrer","Roger Federer",  
       "Andy Murray","Tomas Berdych",  
       "Juan Martin Del Potro"};  
List<String> players =  Arrays.asList(atp);  
  
// 以前的循环方式  
for (String player : players) {  
     System.out.print(player + "; ");  
}  
  
// 使用 lambda 表达式以及函数操作(functional operation)  
players.forEach((player) -> System.out.print(player + "; "));  
   
// 在 Java 8 中使用双冒号操作符(double colon operator)  
players.forEach(System.out::println);

3. 知识拓展

(1)匿名内部类
以往先建抽象类,继承这个抽象类再开始创建对象的,否则对象是无法创建的,为了简便使用匿名内部类,允许在主方法当中进行抽象类的实例化,同时也可以进行对象的创建。

//抽象类
abstract class Chouxiang
{
    String name="Geek Song";//抽象类的属性是不会被调用的,除了方法
    public void say3()
    {
        System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");
    }
}

public class innerclass {
    public static void main(String[] args) {
    //匿名内部类
        Chouxiang c=new Chouxiang() {
            String name="Geek Song too";
            public void say3()
            {
                System.out.println("这是匿名内部类当中的方法,重写了抽象类的方法");
                System.out.println(name);
            }

}}

相关文章

网友评论

      本文标题:【JAVA基础】Lambda

      本文链接:https://www.haomeiwen.com/subject/bwkzrctx.html