美文网首页Java自学
Java自学-Lambda 方法引用

Java自学-Lambda 方法引用

作者: Wester西人 | 来源:发表于2020-02-20 14:27 被阅读0次

Lambda 方法引用

步骤 1 : 引用静态方法

首先为TestLambda添加一个静态方法:

public static boolean testHero(Hero h) {
   return h.hp>100 && h.damage<50;
}

Lambda表达式:

filter(heros, h->h.hp>100 && h.damage<50);

在Lambda表达式中调用这个静态方法:

filter(heros, h -> TestLambda.testHero(h) );

调用静态方法还可以改写为:

filter(heros, TestLambda::testHero);

这种方式就叫做引用静态方法

引用静态方法
package lambda;
   
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
   
import charactor.Hero;
   
public class TestLambda {
    public static void main(String[] args) {
        Random r = new Random();
        List<Hero> heros = new ArrayList<Hero>();
        for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
        }
        System.out.println("初始化后的集合:");
        System.out.println(heros);
           
        HeroChecker c = new HeroChecker() {
            public boolean test(Hero h) {
                return h.hp>100 && h.damage<50;
            }
        };
          
        System.out.println("使用匿名类过滤");
        filter(heros, c);
        System.out.println("使用Lambda表达式");
        filter(heros, h->h.hp>100 && h.damage<50);
        System.out.println("在Lambda表达式中使用静态方法");
        filter(heros, h -> TestLambda.testHero(h) );
        System.out.println("直接引用静态方法");
        filter(heros, TestLambda::testHero);
    }
       
    public static boolean testHero(Hero h) {
        return h.hp>100 && h.damage<50;
    }
       
    private static void filter(List<Hero> heros, HeroChecker checker) {
        for (Hero hero : heros) {
            if (checker.test(hero))
                System.out.print(hero);
        }
    }
   
}

步骤 2 : 引用对象方法

与引用静态方法很类似,只是传递方法的时候,需要一个对象的存在

TestLambda testLambda = new TestLambda();
filter(heros, testLambda::testHero);

这种方式叫做引用对象方法

引用对象方法
package lambda;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
import charactor.Hero;
 
public class TestLambda {
    public static void main(String[] args) {
        Random r = new Random();
        List<Hero> heros = new ArrayList<Hero>();
        for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
        }
        System.out.println("初始化后的集合:");
        System.out.println(heros);
     
        System.out.println("使用引用对象方法  的过滤结果:");
        //使用类的对象方法
        TestLambda testLambda = new TestLambda();
        filter(heros, testLambda::testHero);
    }
     
    public boolean testHero(Hero h) {
        return h.hp>100 && h.damage<50;
    }
     
    private static void filter(List<Hero> heros, HeroChecker checker) {
        for (Hero hero : heros) {
            if (checker.test(hero))
                System.out.print(hero);
        }
    }
 
}

步骤 3 : 引用容器中的对象的方法

首先为Hero添加一个方法

public boolean matched(){
   return this.hp>100 && this.damage<50;
}

使用Lambda表达式

filter(heros,h-> h.hp>100 && h.damage<50 );

在Lambda表达式中调用容器中的对象Hero的方法matched

filter(heros,h-> h.matched() );

matched恰好就是容器中的对象Hero的方法,那就可以进一步改写为

filter(heros, Hero::matched);

这种方式就叫做引用容器中的对象的方法

引用容器中的对象的方法
package lambda;
   
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
   
import charactor.Hero;
   
public class TestLambda {
    public static void main(String[] args) {
        Random r = new Random();
        List<Hero> heros = new ArrayList<Hero>();
        for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
        }
        System.out.println("初始化后的集合:");
        System.out.println(heros);
         
        System.out.println("Lambda表达式:");       
        filter(heros,h-> h.hp>100 && h.damage<50 );
 
        System.out.println("Lambda表达式中调用容器中的对象的matched方法:");       
        filter(heros,h-> h.matched() );
  
        System.out.println("引用容器中对象的方法 之过滤结果:");       
        filter(heros, Hero::matched);
    }
       
    public boolean testHero(Hero h) {
        return h.hp>100 && h.damage<50;
    }
       
    private static void filter(List<Hero> heros, HeroChecker checker) {
        for (Hero hero : heros) {
            if (checker.test(hero))
                System.out.print(hero);
        }
    }
   
}

步骤 4 : 引用构造器

有的接口中的方法会返回一个对象,比如java.util.function.Supplier提供
了一个get方法,返回一个对象。

public interface Supplier<T> {
    T get();
}

设计一个方法,参数是这个接口

public static List getList(Supplier<List> s){
  return s.get();
}

为了调用这个方法,有3种方式
第一种匿名类:

Supplier<List> s = new Supplier<List>() {
    public List get() {
        return new ArrayList();
    }
};
List list1 = getList(s);

第二种:Lambda表达式

List list2 = getList(()->new ArrayList());

第三种:引用构造器

List list3 = getList(ArrayList::new);

.

package lambda;
 
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
 
public class TestLambda {
    public static void main(String[] args) {
    Supplier<List> s = new Supplier<List>() {
        public List get() {
            return new ArrayList();
        }
    };
 
    //匿名类
    List list1 = getList(s);
     
    //Lambda表达式
    List list2 = getList(()->new ArrayList());
     
    //引用构造器
    List list3 = getList(ArrayList::new);
 
    }
     
    public static List getList(Supplier<List> s){
        return s.get();
    }
      
}

练习引用构造器

把比较ArrayList和LinkedList的区别这段代码,改造成引用构造器的模式。
目前的调用方式是:

    List<Integer> l;
    l = new ArrayList<>();
    insertFirst(l, "ArrayList");

    l = new LinkedList<>();
    insertFirst(l, "LinkedList");

改造后的调用方式将变为:

    insertFirst(ArrayList::new, "ArrayList");
    insertFirst(LinkedList::new, "LinkedList");
package collection;
  
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
  
public class TestCollection {
    public static void main(String[] args) {
        List<Integer> l;
        l = new ArrayList<>();
        insertFirst(l, "ArrayList");
  
        l = new LinkedList<>();
        insertFirst(l, "LinkedList");
  
    }
  
    private static void insertFirst(List<Integer> l, String type) {
        int total = 1000 * 100;
        final int number = 5;
        long start = System.currentTimeMillis();
        for (int i = 0; i < total; i++) {
            l.add(0, number);
        }
        long end = System.currentTimeMillis();
        System.out.printf("在%s 最前面插入%d条数据,总共耗时 %d 毫秒 %n", type, total, end - start);
    }
  
}

答案

package collection;
   
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Supplier;
   
public class TestCollection {
    public static void main(String[] args) {
        insertFirst(ArrayList::new, "ArrayList");
        insertFirst(LinkedList::new, "LinkedList");
    }
   
    private static void insertFirst(Supplier<List> s, String type) {
        int total = 1000 * 100;
        final int number = 5;
        long start = System.currentTimeMillis();
        List list = s.get();
        for (int i = 0; i < total; i++) {
            list.add(0, number);
        }
        long end = System.currentTimeMillis();
        System.out.printf("在%s 最前面插入%d条数据,总共耗时 %d 毫秒 %n", type, total, end - start);
    }
   
}

相关文章

  • Java自学-Lambda 方法引用

    Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: Lambda表达...

  • (转)Java8 lambda使用总结-结合实例介绍

    原文:深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法) 原文:Java8...

  • JAVA 8 新特性

    1.JAVA 8 新特性 Lambda表达式:Lambda允许把函数作为一个方法的参数; 方法引用:方法引用提供了...

  • 转:Java 8 重要语言特性:lambda 表达式

    转载自:《深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)》——Luci...

  • java8

    1.lambda表达式《java8 Lambda表达式简介》 《java8 lambda表达式,方法的引用以及构造...

  • Java8 函数式接口 学习笔记

    一, 函数式编程 java中的函数式编程体现就是Lambda和方法引用: Lambda Lambda除了简洁之外,...

  • JDK1.8新特性(超详细)

    Java函数式设计 实现方法: @FunctionalInterface接口 Lambda语法 方法引用 接口de...

  • Lambda 小记

    基本语法: 下面是Java lambda表达式的简单例子 方法引用 参考 静态方法引用 特定对象的方法引用 特定类...

  • Java 8 - 方法引用

    Java 8 - 方法引用 1 Java 8-概述2 Java 8 - Lambda表达式3 Java 8 - 方...

  • Java 8、Java 9、Java 10 新特性

    Java8 Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用 ...

网友评论

    本文标题:Java自学-Lambda 方法引用

    本文链接:https://www.haomeiwen.com/subject/pgjxqhtx.html