JDK1.8新特性02--lambda表达式与方法引用

3. lambda表达式

Lmabda表达式的语法总结: () -> ();

3.1 左边小括号中参数类型可以省略,编译器会自动匹配。

3.2 左右遇一省括号,即如果只有一个参数,可省去左边小括号;如果lambda方法体中只有一条语句,可省略右边大括号,且如果该语句是返回语句,可省去return。

4. 方法引用

若lambda体中的内容有方法已经实现了,那么可以使用“方法引用”

4.1. 静态方法引用   ClassName::staticMethodName

前提:抽象方法 和 静态方法的方法参数列表 要完全匹配

4.2. 特定实例对象的方法引用   instanceReference::methodName

前提:抽象方法 和 实例方法 的方法参数列表 要完全匹配

注意:实例对象还可以是super, this 

4.3. 同类型的任意对象的实例方法引用  ClassName::methodName

前提:抽象方法的第一个参数 absMethod(A a, B b, C c) a的类型A 必须为 ClassName,因为该形式方法引用,默认第一个参数a为方法methodName的调用者,其余参数b,c为methodName的方法参数。即  A::methodName(B b,C c)

4.4. 构造方法引用 ClassName::new

前提:类ClassName中必须存在某个构造器,其构造参数列表,与函数式接口中参数列表保持一致

注意:对于数组,可以使用 Type[]::new 的方式,其中Type为数组类型,但是该形式方法引用仅当函数式接口中参数有且只有一个int型参数时才可以,该参数会被作为构造的数组的初始长度。

以上一些代码实例可参考https://www.cnblogs.com/MadYanYan/p/9788190.html

4.5. 补充 当lambda体中的方法有泛型时,可以在双冒号:: 之后用<T>指定类型。

public interface MyFunc<T> {
    int func(T[] als, T v);
}
 
public class MyArrayOps {
    //统计v在数组中出现的次数
    public static <T> int countMatching(T[] array, T v) {
        int count = 0;
        for (T t : array) {
            if (t.equals(v)) count++;
        }
        return count;
    }
}
 
public class Run {
 
    public static <T> int myOp(MyFunc<T> f, T[] array, T v) {
        return f.func(array, v);
    }
 
    public static void main(String[] args) {
        Integer[] vals = {1, 2, 3, 4, 2, 3, 4, 4, 5};
        String[] strs = {"One", "Two", "Three", "Two"};
 
        //不指定MyFunc类型时,可根据后面的参数推断
        int count1 = myOp(MyArrayOps::countMatching, vals, 4);
        System.out.println("vals contains " + count1 + " 4s");
 
        //要指定类型时,可以在::后面指定,指定完可以限制后面两个参数的类型
        int count2 = myOp(MyArrayOps::<String>countMatching, strs, "Two");
        System.out.println("strs contains " + count2 + " Twos");
    }
}
 
//本例子参考自:https://www.cnblogs.com/xiaoxi/p/7099667.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值