lambda 怎么区分绑定实例方法引用和非绑定实例方法引用

在学习lambda表达式方法引用模块时,有四个概念

  1. 静态方法引用
  2. 绑定实例方法引用
  3. 非绑定实例方法引用
  4. 构造器实例方法引用

 

 

名字

语法

对应的Lambda表达式

静态方法引用

RefType::staticMethod

(args)->RefType.staticMethod(args)

绑定实例方法引用

expr::instMethod

(args)->expr.instMethod(args)

非绑定实例方法引用

RefType:: instMethod

(arg0,rest)->arg0. instMethod(rest)

构造器方法引用

ClsName::new

(args)->new ClsName(args)

 

 

 

 

 

 

静态方法与构造器方法引用容易理解,这里不做叙述。

主要区分实例方法两种引用方式的区别

废话不多说直接上代码:

 

 /**
         * 为了区分绑定实例方法引用和非绑定实例方法引用的区别用下面实例
         * Map.replaceAll(BiFunction) 同时提供绑定与非绑定的实例方法引用
         *
         * Map.replaceAll 的效果是对map中的每个键值对引用其BiFunction函数参数并使用结果替换键值对中的值部分
         *
         */
        Map map = new TreeMap<>();
        map.put("alpha","X");
        map.put("bravo","Y");
        map.put("charlie","Z");
        String str = "alpha-bravo-charlie";

        //1.通过绑定方法引用来调用replace作为参数传入replaceAll中
        map.replaceAll((x,y)->str.replace(x,y));//调用与str实例绑定的replace方法作为参数传入Map.replace(BiFunction)中实现map值替换的目的  简写方式如下
//        map.replaceAll(str::replace);
        map.forEach((x,y)-> System.out.println(x+"---->"+y));//拓展:将输出(k,v)功能定义在对象内便能作为Bifunction方法传入如下(必须是两个参数才能作为Bifunction)
        map.forEach(FuncitonRefDemo::getPrintln);

        /**
         * 输出结果如下:
         * alpha---->X-bravo-charlie
           bravo---->alpha-Y-charlie
           charlie---->alpha-bravo-Z
         */
        map = new TreeMap<>();
        map.put("alpha","X");
        map.put("bravo","Y");
        map.put("charlie","Z");
        //2.通过未绑定实例方法引用String::concat 作为参数传入replaceAll中
        map.replaceAll((x,y)->x.concat(y));//concat函数是特殊的BiFunction方法,第一个参数作为方法接收者,因为没有类似str的实例对象接收相反的接收的是不确定的参数,同样是属于未绑定方法引用 使用类型::方法名的方式简写 如下
//        map.replaceAll(String::concat); //x.concat(y),会将键值字符串拼接在一起作为值替换map中的value
        map.forEach(FuncitonRefDemo::getPrintln);
        /**
         * 输出结果如下
         * alpha----->alphaX
         bravo----->bravoY
         charlie----->charlieZ
         */
对比结果发现,虽然concat()方法跟replace方法都是实例方法但是因为一个是绑定方法引用,一个为未绑定方法引用,方法引用的书写方式就变的不同了

总结:两者主要的区别在于实例方法引用时有没有实例对象接收。

你可能感兴趣的:(lambda)