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

  • 相关阅读:
    基于jquery的弹幕实现
    Cookie在顶级域名、二级域名和三级域名之间共享的情况
    报错:Win10 这台计算机中已经安装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新
    Unity中的Text内容有空格导致换行
    逆波兰表达式
    Java基础03 byte[] 与 16进制字符串之间的转换
    nacos Linux 单机模式配置
    Oracle 常用SQL
    软件安装01 Linux下redis安装
    Java基础04 JSONObject 与范型对象转换
  • 原文地址:https://www.cnblogs.com/nayitian/p/14951879.html
Copyright © 2011-2022 走看看