zoukankan      html  css  js  c++  java
  • Java重温学习笔记,Java8新特性:方法引用

    方法引用通过方法的名字来指向一个方法,它可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。

    一、方法引用可以做什么?看如下代码:

    import java.util.*;
    import java.util.stream.Collectors;
     
    public class MyDemo {
        public static void main(String[] args) {
            List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });
    
            strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
        }
    }

    采用方法引用后,可以简化为如下:

    import java.util.*;
    import java.util.stream.Collectors;
     
    public class MyDemo {
        public static void main(String[] args) {
            List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });
    
            strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println);
        }
    }

    二、方法引用有四种形式

    • 静态方法引用       :   ClassName :: staticMethodName
    • 构造器引用        :   ClassName :: new
    • 类的任意对象的实例方法引用:   ClassName :: instanceMethodName
    • 特定对象的实例方法引用  :   object :: instanceMethodName

    1. 静态方法引用

    System.out::println 等价于Lambda表达式 s -> System.out.println(s) ,代码示例:

    import java.util.*;
    import java.util.stream.Collectors;
     
    public class MyDemo {
        public static void main(String[] args) {
            //lambda表达式使用:
            Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> MyDemo.println(s));
            //静态方法引用:
            Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(MyDemo::println);
        }
        
        public static void println(String s) {
            System.out.println(s);
        }
    }

    2. 构造器引用

    () -> new ArrayList<String>() 等价于 ArrayList<String>::new,代码示例:

    Supplier<List<String>> supplier1= () -> new  ArrayList<String>();

    等价于

    Supplier<List<String>> supplier = ArrayList<String>::new;

    3. 类的任意对象的实例方法引用

      Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2));

    等价于

    Arrays.sort(strs, String::compareToIgnoreCase);

    4. 特定对象的实例方法引用

    import java.util.*;
    import java.util.stream.Collectors;
     
    public class MyDemo {
        public static void main(String[] args) {
            MyDemo test = new MyDemo();
            // lambda表达式使用:
            Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> test.println(s));
            // 特定对象的实例方法引用:
            Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(test::println);
        }
        
        public void println(String s) {
            System.out.println(s);
        }
    }

    三、总结

    方法引用代替Lambda表达式对代码的简化程度,远远没有Lambda表达式代替匿名类的简化程度大, 有时反而增加了代码的理解难度。
    为了增强可读性,没有必要刻意使用方法引用。

    本文参考:

    https://www.jianshu.com/p/62465b26818f

    https://www.runoob.com/java/java8-method-references.html

  • 相关阅读:
    后台服务器经典面试题
    Java英语面试题(核心知识篇)
    Java常用英语汇总(面试必备)
    字符压缩编码
    外排序
    基数排序
    Windows Server 2008 R2 部署服务
    LINUX中常用操作命令
    我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
    CSDN-Code平台使用过程中的5点经验教训
  • 原文地址:https://www.cnblogs.com/nayitian/p/14951879.html
Copyright © 2011-2022 走看看