zoukankan      html  css  js  c++  java
  • Java 8学习之Lambda表达式

    一、lambda表达式

    一个lambda表达式包含三个部分:

    • 一段代码
    • 参数
    • 自由变量的值,这里的自由指的是哪些不是参数并且没有在代码中定义的变量。

    示例:

    public static void repeat(String text, int count) {
        Runnable r = () -> {
            for (int i = 0; i < count; i++) {
                System.out.println(text);
                Thread.yield();
            }
        };
    
        new Thread(r).start();
    }
    

    含有自由变量的代码块被称为“闭包”。

    内部类也会补货闭合作用域中的值。在Java 8之前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则也被放宽了。一个内部类可以访问任何有效的final局部变量--即任何值不会发生变化的变量。

    二、默认方法

    public interface DefaultDemo {
        long getId();
    
        default String getName(){
            return "name";
        };
    }
    

    默认方法终结了以前的一种经典模式,即提供一个接口,以及一个实现接口的大多数或全部方法的抽象类,例如Collection/AbstractCollection。现在你只需要在接口中实现那些方法。

    如果一个接口中定义了一个默认方法,而另一个父类或者接口中又定义了一个同名的方法,该选择哪个呢?Java中的规则要简单得多,如下:

    • 选择父类中的方法。如果一个父类提供了具体的实现方法,那么接口中具有相同名称和参数的默认方法会被忽略。
    • 接口冲突。如果一个父接口提供了一个默认方法,而另一个接口也提供了一个具有相同名称和参数类型的方法(不管是不是默认方法),那么你必须通过覆盖该方法来解决冲突。

    三、方法引用

    表达式System.out::println是一个方法引用,等同于lambda表达式x -> System.out.println(x)。

    ::操作符将方法名和对象或类的名字分隔开来。以下是三种主要的使用情况:

    • 对象::实例方法
    • 类::静态方法
    • 类::实例方法

    例如:Math::pow等同于(x,y)->Math.pow(x,y),String::compareToIgnoreCase等同于(x,y)->x.compareToIgnoreCase(y)。

    注意:如果有多个同名的重载方法,编译器会试图从上下文中找到最匹配的一个方法。例如,有两个版本的Math.max方法,一个接收整型作为参数,而另一个接收double类型的值。究竟会选择哪一个方法取决于Math:max被转换为的函数式接口的方法参数。同lambda表达式类似,方法引用也不会独立存在,他们经常被用于转换为函数式接口的实例。

  • 相关阅读:
    Memcached源码分析之memcached.h
    Memcached源码分析之请求处理(状态机)
    Memcached源码分析之线程模型
    Memcached源码分析之从SET命令开始说起
    Memcached源码分析
    jqgrid 获取当前页码
    CSS 居中大全【转】
    判断浏览器是否IE10
    jQuery.validate的this.optional(element)作用
    Java中static、final用法小结
  • 原文地址:https://www.cnblogs.com/f-zhao/p/7365740.html
Copyright © 2011-2022 走看看