Java SE 11 Sliver学习笔记(第八章)

Java SE 11 sliver资格考试相关

第八章 関数型インタフェース、ラムダ式

間違えた:1,3, 4, 6,7,8

間違えし易い:

分からない:5,6,

关键词:lamada式,匿名类函数型接口,

回顾
  1. lamda式的格式:

    (变量名参数) -> {处理};注意,最后要加分号!!

    函数型接口中定义的方法的参数定义和lamda式中的参数定义必须相同。并且lamda式的参数可以省略参数的类型。因为可以使用代入的函数型接口来推断参数的类型。如果函数型接口中的方法定义的时候是无参数的(例如Runnable),可以省略lamda式中的参数。

  2. 函数型接口的类型 变量名 = (变量名参数) -> {处理};中:

    1. 当参数只有一个时,的实际上右边的lamda式可以省略为:函数型接口的类型 变量名 = 参数 -> {处理};
    2. 当实现的处理只有一行时,中括号也可以省略:函数型接口的类型 变量名 = (变量名参数) -> 处理;
    3. 需要返回的情况下,当实现的处理只有一行,且省略了中括号的情况下,return关键字可以省略。
    4. Test t = () -> return "hello!"会报编译错误。相反如果有中括号,一定是有1行以上的处理,且一定不可以省略return关键字。
  3. lamda式中参数不能使用定义lamda式方法中已有的参数的名字,会造成重复定义,例如下面的代码会报编译错误,因为在第三行相当于进行了val字符串的重复定义:

    1
    2
    3
    4
    5
    6
    public void static test() {
    String val = A;
    Function f = (val) -> {
    System.out.println(val);
    };
    }
  4. 关于lamda式的scope问题,lamada可以访问同一方法中定义的其他本地变量,但是变量一定要是实质上final的也就是在lamda式后面值也不能改变,参考这里,下面的代码不会报错,但是如果第8行注释取消就会在第5行报编译错误。因为val变量不再是实质final

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class lamdaScope {
    public static void main(String[] args) {
    String val = "Hello";
    Function f = (nothing ) -> {
    System.out.println(val);
    return null;
    };
    // val = "Hello World!!";
    System.out.println(val);
    }
    }
  5. java.util.function中定义好的函数型接口的问题。参考这里,由于有参数并且返回值是Boolean类型的可以使用排除法去掉Consumer<T>Supplier<T>, 最后因为参数只有一个可以排除Function<T, R>

    函数式接口 参数类型 返回类型 用途
    Consumer<T>(消费型接口) T void 对类型为T的对象应用操作。void accept(T t)
    Supplier<T>(供给型接口) T 返回类型为T的对象。 T get();
    Function<T, R>(函数型接口) T R 对类型为T的对象应用操作并返回R类型的对象。R apply(T t);
    Predicate<T>(断言型接口) T boolean 确定类型为T的对象是否满足约束。boolean test(T t);
  6. Supplier<T>的使用相关问题。参照上表。

  7. Function<T, R>的使用,java.util.function中定义的基本函数型接口中,参数有两个的只有Function<T, R>,其中第一参数用泛型表示可以接收任何类型的参数,第二参数表示返回值的类型。

  8. 关于Consumer<T>(消费型接口)相使用的问题。参照这里

参考

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 Joe
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信