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 方法引用的更多相关文章

  1. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  2. 【Java 8】方法引用

    一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...

  3. java8 lambda方法引用

    注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...

  4. Lambda 方法引用

    1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ①  对象 :: 实例方法 ...

  5. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  6. java中的方法引用(method reference)官方文档总结

    2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...

  7. Java 8 特性 —— 方法引用

    方法引用通过方法的名字来指向一个方法.方法引用可以使语言的构造更紧凑简洁,减少冗余代码.方法引用使用一对冒号 :: .下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不 ...

  8. Java 8Lambda之方法引用(Method References)

    方法引用分为4类,方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断.具体分类信息如下: 类型 使用方式 静态方法 ContainingClass::staticMeth ...

  9. Java基础教程——方法引用

    方法引用 Lambda表达式的代码,是否可以再简洁?--方法引用 对象/类名::方法名 参数都不用写明. import java.util.function.Consumer; public clas ...

随机推荐

  1. P2571 [SCOI2010]传送带——hyl天梦

    P2571 [SCOI2010]传送带题解----天梦 如写的不好,请多见谅. 对于这道题,我首先想说,确实困惑了我好久,看网上的各种题解,却都不尽人意,思路早已明白,却不会操作.最后想想,还是觉得自 ...

  2. Java中的8种基本数据类型

    JAVA中的8种基本数据类型:byte short int long float double char boolean 特别说明: 1)char类型占2个字节,可以表示汉字.汉字和英文字符都占2个字 ...

  3. Codeforces_446_B

    http://codeforces.com/problemset/problem/446/B 分别将每行的和与每列的和存入优先队列,计算操作n次的最大和,保存每一次结果. 枚举行和列操作的次数,注意要 ...

  4. Python 进行目标检测

    一.前言 从学单片机开始鼓捣C语言,到现在为了学CV鼓捣Python,期间在CSDN.简书.博客园和github这些地方得到了很多帮助,所以也想把自己做的一些小东西分享给大家,希望能帮助到别人.记录人 ...

  5. 一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

    今天给大家翻译一篇由ASP.NET首席开发工程师James Newton-King前几天发表的一篇博客,文中带来了一个实验性的产品gRPC-Web.大家可以点击文末的讨论帖进行相关反馈.我会在文章末尾 ...

  6. Unity酱~ 卡通渲染技术分析(一)

    前面的话 unitychan是日本unity官方团队提供的一个Demo,里面有很好的卡通渲染效果,值得参考学习 上图是我整理出来的shader结构,可以看到Unity娘被拆分成了很多个小的部件,我想主 ...

  7. 博客圆美化主题推荐之Slience

    博客圆美化主题推荐之Slience 一.前言 本博客美化主题作者为:Esofar,本文仅在教导如何快速把该美化主题应用到自己的博客中,详细部署内容见Silence - 专注于阅读的博客园主题. 二.博 ...

  8. 今天第一天开通博客,随笔总结一下resultType(属性)和resultMap,collection和association,Statement和PreparedStatement各自的区别

    1.resultType(属性)和resultMap(标签引用)的区别? resultType不支持自定义返回结果,会将查询到的结果通过到type中java对象的同名的属性,对象中的属性名必须和数据库 ...

  9. jmeter接口测试(登录、注册)

    Jmeter 进行接口测试流程: Jmeter 的下载地址:http://jmeter.apache.org/download_jmeter.cgi 下面举例说明使用流程,有两种参数传递的方式,我们以 ...

  10. 寒假答辩作品——掘地求升C语言版

    寒假答辩—掘地求升(C语言版) 前言 这个是作为寒假答辩作品写的. 之前考虑过用Unity写个游戏,但毕竟不熟悉C#,感觉几乎都是在套模板,而且写着不顺手,有想法却只能 看着C#发呆,很是无奈,所以决 ...