• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java8新特性
    Java9新特性

    Java8方法引用

     

     

    方法引用可以讓你重復使用現有的方法定義, 并像Lambda一樣傳遞它們. 如:

     

    list.forEach( x -> System.out.println(x) );

     

    使用方法引用可以這樣:

     

    list.forEach( System.out::println );

     

    方法引用可以看作是僅僅調用特定方法的Lambda表達式的一種快捷寫法。

     

    需要使用方法引用時, 目標引用放在分隔符::前面, 方法名放在::的后面, 注意,只需要方法名不需要小括弧。

     

    (Student stu) -> stu.getScore() 改為方法引用: Student::getScore

     

    () ->Thread.currentThread().dumpStack() 改為方法引用: Thread.currentThread()::dumpStack

     

    (Str, i) -> Str.substring(i) 改為方法引用: String::substring

     

    a -> System.out.println(a) 改為方法引用: System.out::prinltn

     

     

    如何構建方法引用

     

    方法引用主要有三類:

     

    ● 指向靜態方法的方法引用

     

    Lambda表達式: (args) -> ClassName.staticMethod(args)

     

    方法引用: ClassName::staticMethod

     

    Integer[] data ={65,23,87,2,34,99};

     

    Arrays.sort( data, Integer::compare );

     

    ● 指向任意類型的實例方法的引用

     

    Lambda表達式 (args0, args1) -> args0.instanceMethod(args1)

     

    args0是Classname類型的一個對象。

     

    方法引用: Classname :: instanceMethod

     

    ● 指向現有對象的實例方法的引用

     

    Lambda表達式: (args) -> obj.instanceMethod(args)

     

    方法引用: obj::instanceMethod

     

    public class Test05MethodReference {
        public static void main(String[] args) {
            Integer[] data  ={65,23,87,2,34,99};
            Arrays.sort(  data,  Integer::compare );        //引用靜態方法
            System.out.println(Arrays.toString(data));
    
            List<String> list = Arrays.asList("WKcto", "Abc", "XXx");
            list.sort(String::compareTo);               //引用實例方法
            System.out.println(list);
    
            list.forEach(System.out::println);      //對System.out這個實例方法的引用
        }
    }

     

     

    構造方法引用

     

    對于一個現有的構造方法,可以使用類名和關鍵字new來創建一個構造方法的引用: Classname::new

     

    package com.wkcto.lambda;
    
    import java.util.function.BiFunction;
    import java.util.function.Function;
    import java.util.function.Supplier;
    
    /**
     * author: 動力節點老崔
     * 2019/3/13
     */
    public class Test06ConstructorReference {
        public static void main(String[] args) {
            //1)引用無參構造方法
            Supplier<Person> supplier = Person::new;
            Person p1 = supplier.get();
            System.out.println(p1);
    
            //2)引用有一個參數的構造方法
            Function<String,Person> function = Person::new;
            Person p2 = function.apply("feifei");
            System.out.println( p2 );
    
            //3)引用有兩個參數的構造方法
            BiFunction<String,Integer,Person> biFunction = Person::new;
            Person p3 = biFunction.apply("feifei", 28);
            System.out.println(p3);
    
            //4)如果引用有三個參數及三個以上參數的構造方法,需要自定義匹配的函數式接口
            TriFunction<String, Integer, String, Person> triFunction = Person::new;
            Person p4 = triFunction.apply("laodu", 35, "男");
            System.out.println(p4 );
        }
    }
    
    @FunctionalInterface
    interface TriFunction<T,U,V,R>{
        R apply(T t, U u, V v);
    }
    
    class  Person{
        String name;
        int age;
        String gender;
    
        public Person(String name, int age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public Person() {
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }

     

     

    Lambda練習

     

    package com.wkcto.lambda;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    
    /**
     * author: 動力節點老崔
     * 2019/3/13
     */
    public class Test07Exercise {
        public static void main(String[] args) {
            //定義List集合存儲Student
            List<Student> list = new ArrayList<>();
            list.add( new Student("lisi", 80));
            list.add( new Student("zhangsan", 30));
            list.add( new Student("wangwu", 90));
            list.add( new Student("feifei", 60));
            list.add( new Student("mingge", 100));
            System.out.println(list);
    
            //使用匿名內部類排序
            list.sort(new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    return o1.name.compareTo(o2.name);
                }
            });
            System.out.println(list);
    
            //使用Lambda表達式
            list.sort((p1,p2) -> p2.name.compareTo(p1.name));
            System.out.println(list);
    
            //Comparator接口中有一個comparing靜態方法返回Comparator比較器
            list.sort(Comparator.comparing((stu)->stu.name));
            System.out.println(list);
    
            //方法引用,Student類中getScore方法返回成績
            list.sort(Comparator.comparing(Student::getScore));
            System.out.println(list);
        }
    }
    
    class  Student{
        String name;
        int score;
    
        public Student(String name, int score) {
            this.name = name;
            this.score = score;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    '}';
        }
    
        public int getScore() {
            return score;
        }
    }

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏