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

  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/nayitian/p/14951879.html
Copyright © 2011-2022 走看看