2019-02-03——Java8 Lambda

一.认识Lambda

  1. Lambda表达式专门针对只有一个方法的接口(即函数式接口)
  2. lambda表达式的基本格式为(x,y...)—>{表达式...};
    (1)可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    (2)可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    (3)可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    (4)可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
  • 在我的理解看来更像是实现一个函数式接口; x,y...表示抽象方法的入参数,表达式实际上是抽象的具体实现
    比如:
    首先定义了一个函数式接口:
public interface Operation{
      int operator(int x,int y);
}

其次定义一个方法,入参为该接口类型

public class Test{
    public void t(Operation o){
        o.operator(x,y);
    }
}

最后调用t方法的方式:

  1. 第一种,也是最古老的一种传入一个Operation接口的实现
public void m(){
      t(new Operation(){
          @Override
          public int operator(int x,int y){
                return x*x+y*y;
          }
      });
}

2.第二种,使用lambda表达式

public void m(){
      t((x,y)->x+y);
}

3.第三种,也就是方法引用
(1)首先需要一个方法

public class Other{
      public static int other(int m,int n){
          return m*n;
      }
}

(2)其次在t方法中进行方法引用

public void m(){
       t(Other::other);
}

最终的效果就是:

public void m(){
        t(new Operation() {
            @Override
            public int operator(int x, int y) {
                return x*x+y*y;
            }
        });
        t((x,y)->x+y);
        t(Other::other);
}

比较一下Other类的other方法和Operation接口的operator方法可以看出两个方法都是传入两个int型参数返回一个int类型的值。
我觉得Java8的函数式编程打破了以往的束缚,在以往方法定义了一个类型的入参,在调用方法的时候必须传入该类型的实例。但是函数式接口却打破了这一约束,把函数式接口当作形参感觉更像是传入方法的实现而非接口的实现

  • Lambda表达式并非是方法的实现

对于方法的引用我们可以换个写法

public void m(){
      t((x,y)->Other.other(x,y));
}

如果不够清晰可以在定义一个方法

public static String another(int x,int y,int z){
        return (x*y*z)+"";
 }

对该方法的引用如下

public void m(){
      t((x,y)->{
            String another = Other.another(x, y, 10);
            return Integer.parseInt(another);
        });
}

通过这个写法可以看出对方法的引用其实是一种对接口实现的简化。
(1)简化了方法调用
(2)简化了返回值
(3)简化了大括号
最后在比较一下几种调用方式:

public void m(){
        t(new Operation() {
            @Override
            public int operator(int x, int y) {
                return x*x+y*y;
            }
        });
        t((x,y)->x+y);
        t(Other::other);
        t((x,y)->Other.other(x,y));
        t((x,y)->{
            String another = Other.another(x, y, 10);
            return Integer.parseInt(another);
        });
}

你可能感兴趣的:(2019-02-03——Java8 Lambda)