zoukankan      html  css  js  c++  java
  • 深入理解Java 8 Lambda

    - 转载:blog1, blog2

    以上两篇博客是对lambda表达式的深入理解,用于后续加深理解。

    如下先从零开始理解lambda,

    1. 接触lambda表达式是从python,javascript这些弱类型语言开始的,当时也是一知半解。

    感觉是直接支持了数学样式的公式,比如

    (x,y) -> x + y

    是不是想到了数学中类似以下的表达方式?

    f(x,y) = x + y

    然后仅限于此,知道有lambda表达式这个、基本会用也就拉到了。

    2. Java在JDK8中引入了lambda,然后直到现在才探究下其中的使用。不过上来还是感觉不知道该怎么定义lambda和该如何使用。看了<<Effective Java>>也是云里雾里的。

    还是看了这篇基础的blog才有了初步认识。

    (1) lambda表达式可以认为是匿名类的一种实现

    String[] strArray = {"er","zgfwdghnk","sdhgwe"};
    Arrays.sort(strArray, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    });
    
    for (String str : strArray){
        System.out.println(str);
    }

    拿以上例子来说,在排序中需要用到Comparator的接口实现,也就是匿名类实现。而这个实现就可以用lambda替代,如下

    Arrays.sort(strArray, (o1, o2) -> o1.length() - o2.length());
    
    for (String str : strArray){
        System.out.println(str);
    }

    lambda相比较于匿名类实现,减少那些死板的代码,只保留功能部分,更加简洁。

    那是不是lambda就能完全替代匿名类实现呢?答案是不能 -> (2)

    (2) lambda表达式对应的接口只能有一个抽象方法

    既然lambda与匿名类实现相似,也就可以想象成lambda也是由接口支撑的。实际上,对应于lambda的接口被称为函数式接口(Functional Interface)。当然,函数式接口区别于其他接口的重要一点是,其中的抽象方法有且仅有一个

    @java.lang.FunctionalInterface
    public interface FunctionalInterface<V1, V2, V3> {
        String apply(V1 v1, V2 v2, V3 v3);
        //String apply(String param);
    }

    在java.util.function包下共有43个函数式接口,应该足够用。当然也可以如上,定义自己的函数式接口。函数式接口的设计遵从接口定义的约定。

    (3) lambda表达式需要依据函数式接口的输入输出类型编写,并作为函数对象传递进方法

    比如以上自定义的函数式接口(包含泛型),输入类型V1, V2, V3,返回类型String,那么对应的lambda表达式就应该是(V1 x, V2 y, V3 z) -> String类型。

    之后是使用lambda表达式的具体方法,如下

    public class MyClass {
    
        public void testLambdaWithSelfFunctionalInternal(int[] intArray, FunctionalInterface<Integer,Integer,Integer> functionalInterface){
            Objects.requireNonNull(intArray);
            if (intArray.length != 3){
                throw new IllegalArgumentException("3 int parameters required");
            }
            System.out.println(functionalInterface.apply(intArray[0],intArray[1],intArray[2]));
        }
    
    }

    函数式接口作为方法参数之一。将来的lambda表达式就是通过函数式接口传入的。

    MyClass myClass = new MyClass();
    int[] array = {1,2,3};
    myClass.testLambdaWithSelfFunctionalInternal(array,(x,y,z) -> "Sum = " + String.valueOf(x+y+z));
  • 相关阅读:
    MVC Controller 下载文件
    C#中字符串转日期类型
    MVC中使用Hangfire按秒执行任务
    Excel vba中访问ASP.NET MVC项目,记录访问时间,文件名称
    MSSQL SERVER收缩日志文件
    匿名线程启动
    常用颜色表以及中国传统颜色名录
    elasticsearch.net search入门使用指南中文版
    InstallShield程序打包图解
    [转]让程序只能打开一个
  • 原文地址:https://www.cnblogs.com/hello-yz/p/10173698.html
Copyright © 2011-2022 走看看