美文网首页技术栈
2019-02-03——Java8 Lambda

2019-02-03——Java8 Lambda

作者: 烟雨乱平生 | 来源:发表于2019-02-03 14:46 被阅读0次

    一.认识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

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