Java8 实战学习 方法引用

《Head First Java》第三版:从零基础到实战的Java学习指南 Java作为一门面向对象的编程语言,其核心在于对象、类、继承、多态等基本概念的理解与应用。这些概念构成了Java编程的基石,其原理是通过封装、继承和多态三大特性来实现代码的复用性、扩展性和维护性。掌握这些基础不仅能提升代码质量,更是深入理解现代Java开发中Lambda表达式、Stream API等高级特性的前提。在工程实践中,例如构建桌面应用、处理集合数据或进行网络编程时,扎实的面向对象基础尤为关键。本文以《Head First Java(第三版)》为蓝本,深入剖析了如何通过独特的认知科学设计方法,有效学 阅读详情

Java8 实战学习 方法引用

有时,lambda表达式只会调用现有方法。 在这些情况下,通过名称引用现有方法往往更加清楚。 方法参考使您能够做到这一点; 对于已经有名称的方法,它们是紧凑的,易于阅读的lambda表达式。


方法引用

方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。

书中这么描述方法引用,但是自我感觉方法引用还是蛮难得,至少对我来说。那我们就来看下方法引用到底是什么。

方法引用的一个例子:

(Apple a) -> a.getWeight()

等价于

Apple::getWeight

什么是方法引用

方法引用在书中被称为 Lambda 的语法糖,语法糖大致意思就是一种为了简化代码书写的语法:

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·蘭丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。

什么意思呢?就是只是为了简化某种代码的写法,而定义的一个新的语法,比如我们 for 循环大多情况下可以使用 foreach 来替换,那么foreach 就是 for 循环的语法糖。而我们用 foreach的时候并没有问太多,因为学习的时候就给我们画上了等号。所以学习方法引用我们可以类比这样的写法。

Lambda 的语法糖就是为了在特定情况下简化 Lambda 书写的语法, wfc! Lambda 看起来都费劲,还要简化,那我写出来的代码是不是就没人能懂了? 个人经过了一天的挣扎后,还是打算拥抱这个变化,这就是一个转变的过程,思想固化后再去接受新的思想需要经历一个过程。

书中对方法引用做了下面的解释:

方法引用可以被看作仅仅 「调用特定方法」 的 Lambda 的一种快捷写法。

它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。

方法引用看作针对「仅仅涉及单一方法的Lambda」的语法糖。

相信大多数人看到这句话以后都有如下的疑问点:

  • 「调用特定方法」的快捷写法,什么方法是特定方法?
  • 「只是“直接调用这个方法”」这个方法?

如果 Lambda 表达式的方法体内,只是调用一个已有的方法,如 Apple 的 getWeight() 方法,String 的 length() 方法,那么我们就可以把这类的 Lambda 修改成方法引用的方式书写。

这里举个例子方便理解:

假如我们需要将一筐苹果的重量全部统计出来

  1. 我们定义一个方法用来提取指定集合中的苹果的重量:

     private static List<Integer> coverAppleWeight(List<Apple> apples, CoverConsumer consumer) {
            List<Integer> list = new ArrayList<>();
            for (Apple a : apples) {
                list.add(consumer.cover(a));
            }
            return list;
        }
  2. 我们需要一个函数接口来完成转换操作,这里的方法签名为 T -> R ,即从一个对象中 选择/提取,我们可以使用 Java 8 提供的 Function 接口或者自己创建一个函数接口:

     public interface CoverConsumer {
        int cover(Apple apple);
     }
  3. 使用该方法来提取苹果质量:

       List<Apple> apples = new ArrayList<>();
       apples.add(new Apple(10));
       apples.add(new Apple(11));
       apples.add(new Apple(12));
       apples.add(new Apple(13));
    
       coverAppleWeight(apples, (Apple a) -> a.getWeight());//满足 T->R 的Lambda

    满足 T->R 的Lambda 作为 CoverConsumer 的实例传递给 coverAppleWeight 来完成提取操作,具体操作内容就是拿到每个苹果的质量。

    Lambda 的操作在这个时候仅仅

    1. 调用 Apple 的 getWeight() 方法。 属于「调用特定方法」的范围
    2. 仅仅调用了该方法而没有进行任何其他操作。 属于 「直接调用这个方法」 的范围

    因此我们可以使用方法引用来简化 Lambda :

     coverAppleWeight(apples, Apple::getWeight);//调用 Apple 的指定方法 getWeight 而不做操作
  4. 如果我们需要给苹果质量造假,比如我们需要在每个苹果现有的质量加 10 存放如集合,那么还能使用方法引用么,答案是否定的。

    coverAppleWeight(apples, (Apple a) -> a.getWeight() + 10);//不能简化为方法引用调用

方法引用的类别

方法引用主要有三类:

  1. 引用「静态方法」 : ContainingClass::staticMethodName

  2. 引用一个特定对象的实例方法:containingObject::instanceMethodName

  3. 引用特定类型的任意对象的实例方法:ContainingType::methodName

  4. 引用构造函数: ClassName::new


第一种方法引用「静态方法的方法引用」:

还记得我们第一天学习的时候,比较两个苹果质量将苹果按质量从大到小排列的例子么?当时我们是这样实现的:

 apples.sort(new ComparatorApple());//List.sort(Comparator<? super E> c)

    // 隐藏了无关的代码,直接跳到实现
    public static class ComparatorApple implements Comparator<Apple> {

       @Override
       public int compare(Apple a, Apple b) {
           return a.getWeight().compareTo(b.getWeight());
       }
    }

现在我们在 Apple 类中添加一个静态方法用来比较两个苹果的重量:

  class Apple {

        public String name = "Apple";
        private String color;

        Apple(int weight) {
            this.weight = weight;
        }

        public int weight;

        public Integer getWeight() {
            return weight;
        }

        // 用来比较重量的方法
        public static int compareByWeight(Apple a,Apple b){
            return a.getWeight().compareTo(b.getWeight());
        }

        public String getColor() {
            return color;
        }

    }

有了这个方法 我们之前的 Lambda 表达式可以修改一下:

//  首先修改 ComparatorApple 接口

public static class ComparatorApple implements Comparator<Apple> {

       @Override
       public int compare(Apple a, Apple b) {
           return Apple.compareByWeight(a,b);//等价于  return a.getWeight().compareTo(b.getWeight());
       }
}

// 最终调用的 Lambda 可以就修改如下   

apples.sort((Apple a, Apple b) -> Apple.compareByWeight(a, b));

我们知道 compareByWeight() 方法是 Apple 的静态方法,实现的功能跟 Comparator 接口要实现的功能相同,所以 Lambda 表达式的签名也是一致的。

所以我们也可以写为:ContainingClass::staticMethodName 格式。

ContainingClass 为包含这个静态方法的类名,而 :: 后则表示方法名 ,值得注意的是这里不需要参数和()。

apples.sort(Apple::compareByWeight);

–

引用一个特定对象的方法

接着筛选苹果的例子说,apples.sort(Comparator<Apple> c) 参数是接收一个满足 Comparator 目标类型的 Lambda 表达式,这个 Lambda 表达式应该满足下面的要求:

(Apple a, Apple b) -> a.getWeight().compareTo(b.getWeight())

这时候我们恰好有一个 比较器提供者ComparisonProvider:

  public static class ComparisonProvider {
        public int compareByColor(Apple a, Apple b) {
            return a.getColor().compareTo(b.getColor());
        }

        public static int compareByWeight(Apple a, Apple b) {
            return a.getWeight().compareTo(b.getWeight());
        }
    }

它可以提供各式各样的比较方法,但是并不是一个函数式接口。我们可以将之前的代码修改为:

 ComparisonProvider comparisonProvider = new ComparisonProvider();
 apples.sort((Apple a, Apple b) -> {
            return comparisonProvider.compareByColor(a, b);
        });

在这里 comparisonProvider 就是一个「特定对象」,因为这个对象恰好有比较两个苹果的方法compareByColor,而后者就是这个特定对象的方法。此时我们可以使用方法引用的方式简化 Lambda.

  ComparisonProvider comparisonProvider = new ComparisonProvider();
  apples.sort(comparisonProvider::compareByColor);// 特定对象 :: 对象的方法

这里虽然没有写任何有关于 Apple 的参数,但 JRE 可以推断方法类型参数。 喲~ 不错喔。

–

特殊的类型的任意对象的实例方法引用:ContainingType::methodName

  1. 首先「实例方法」是一个类的实例的方法,而不是静态方法。

  2. 其次特定的类的任意对象 : Lambda表达式的主体中你在引用一个对象的方法,而这个对象恰巧是该 Lambda 的参数的对象。

看下边的例子应该好理解:

    // 例子1
  String[] stringArray = {"Barbara", "James", "Mary", "John",
                "Patricia", "Robert", "Michael", "Linda"};
        Arrays.sort(stringArray, String::compareToIgnoreCase);
        List<String> list = Arrays.asList(stringArray);
        list.sort(String::compareToIgnoreCase);
        list.sort((String s, String s1) -> s.compareToIgnoreCase(s1));

   // 例子2
    ArrayList<Apple> apples1 = new ArrayList<>();
        apples1.add(new Apple(10));
        apples1.add(new Apple(11));
        apples1.add(new Apple(12));
        apples1.add(new Apple(13));
        apples1.sort((Apple a, Apple b) -> a.compareTo(b));
        apples1.sort(Apple::compareTo);//compareTo是 Apple的一个实例方法

   // Apple 中的 compareTo 方法 这里并不是 Compator 的重载方法     
   public int compareTo(Apple apple) {
        return this.getWeight().compareTo(apple.getWeight());
    }

构造参数的方法引用

现在我们可以通过 ClassName::new 来创建一个构造参数的引用。

如果一个构造函数没有参数它适合Supplier的签名() -> Apple。

```
  Supplier<Apple> c1 = Apple::new; Apple a1 = c1.get();

 //等价于

  Supplier<Apple> c1 = () -> new Apple(); Apple a1 = c1.get();

```

如果构造函数的包含一个参数,如是Apple(Integer weight) 它就适合Function接口的签名。

 Function<Integer, Apple> c2 = Apple::new; Apple a2 = c2.apply(110)

        //等价于

 Function<Integer, Apple> c2 = (weight) -> new Apple(weight); Apple a2 = c2.apply(110);

如果你有一个具有两个参数的构造函数Apple(String color, Integer weight) 那么就可以应用 BiFunction 接口的签名:

BiFunction<String, Integer, Apple> c3 = Apple::new;
Apple c3 = c3.apply("green", 110);

//等价于

BiFunction<String, Integer, Apple> c3 = (color, weight) -> new Apple(color, weight); Apple c3 = c3.apply("green", 110);

如果你需要更多的参数的构造函数,那么你可以自己创建这个函数式接口。

public interface TriFunction<T, U, V, R>{

R apply(T t, U u, V v);

}

TriFunction<Integer, Integer, Integer, Color> colorFactory = Color::new;

关于方法引用的总结:

  1. 方法引用是 Lambda 的语法糖,可以进一步简化 Lambda 的书写。

  2. 方法引用有四种应用场景: 1. 调用静态方法的情况,2.调用一个满足条件的类对象的实例方法(这个对象通常为局部变量) 3. 满足条件的类的任意对象的实例方法 4. 构造参数

  3. 在使用的过程中建议不要直接写出方法引用,通过先写 Lambda 表达式,然后通过编辑器转化为 方法引用的方式。毕竟 IntelliJ(2017.1之后的版本) 这么强大。

Java8学习笔记(五)—— 方法引用(::双冒号操作符) Java8学习笔记系列: Java8学习笔记(一)—— 函数式编程的四个基本接口 Java8学习笔记(二)—— Lambda表达式 Java8学习笔记(三)—— Optional类的使用 Java8学习笔记(四) —— Stream流式编程 Java8学习笔记(五)—— 方法引用(::双冒号操作符) 一、什么是方法引用? 简单来说就是一个Lambda表达式,方法引用提... 阅读详情

相关推荐

详解Java8特性之方法引用

前言在详解Java8特性之Lambda表达式 中我介绍了Java8中的Lambda表达式,通过Lambda表达式我们就可以快速地创建一个函数式接口的实例,可以说是大大简便了我们开发。你以为只能做到这么简便了嘛,big big wrong,大大的错,还可以再简便一点。有请我们今天的主角—方法引用在学习这个之前的得确保你已经学习过Lambda表达式了,因为这个是用在Lambda表达式的。方法引用方法引用

腹黑大壁花 1万+

Java8新特性—方法引用

Java 8引入了方法引用(method reference)作为一种语言特性,它可以简化代码,使得代码更加易读和易于维护。方法引用可以被视为Lambda表达式的简写形式,可以用来替代Lambda表达式中只调用一个已有方法的情况。总的来说该特性使得Java代码更加简洁和灵活。方法引用可以用于任何函数式接口的实现,尤其是在需要多次调用同一方法时,可以大大简化代码。例如,当需要对一个集合进行排序时,可以使用方法引用来指定排序依据,从而大大简化代码。

小薯条的博客 1535

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1629

java8新特性之方法引用

java8方法引用有四种形式: 静态方法引用       :   ClassName :: staticMethodName 构造器引用        :   ClassName :: new 类的任意对象的实例方法引用:   ClassName :: instanceMethodName 特定对象的实例方法引用  :   object :: instanceMethodName lambda表达式可用方法引用代替的场景可以简要概括为:lambda表达式的主体仅包含一个表达式,且该表达式仅调用.

无区新手的博客 493

MCU 微控制器,在实际项目中如何选型(以 STM32为例)

1.MCU 选型需要考虑的一些因素 2.案例:传感器设备的 MCU 选型

创享 AIOT 的专栏 1万+

odoo19/18集成reportbro 打印插件 完美支持静默打印

ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。ReportBro Designer可以轻松集成到您的Web应用程序中。每个人都可以设计和编辑文档模板,并直接在浏览器中预览它们。可以使用服务器上的 (有关完整的文档和演示,请参阅上的ReportBro项目网站。reportBro官方没有提供。测试环境:odoo17社区版。2.产品标签打印设计。

zxltwins的博客 2771

Java学习----【Java8】 方法引用详解

方法引用省去了lambda,将接口方法实现的内容封装到具体方法,将方法作为接口实现,实际也是实现且创建一个接口对象。只是更加抽象,只能看到接口方法内部实现(调用的这个方法就是具体实现)。采用方法引用可以更近一步的简化代码,有时候这种简化让代码看上去更加的直观。

qq_43514707的博客 678

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3777

java8简化的可变参数调用,Java8新特性--方法引用

一.什么是方法引用?​ 谈到方法引用,就必须提到Lambda,因为方法引用是用在Lambda表达式的,方法引用是一种更简洁易懂的Lambda表达式,和Lambda表达式一样,也是一种语法糖。​ 当我们需要使用Lambda表达式来实现一个函数式接口的抽象方法时,已经有存在的类实现了我们需要的功能方法,这时我们完全没必要再造一个实现方法,可以直接用Lambda表达式调用这个方法来实现,虽然这样子实现可...

weixin_32279911的博客 495

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

基于ResNet + LLM大语言模型的分类识别系统设计与实现,Web前后端分离,Django+vue3+AI助手模块+ResNet50算法+LLM 联动+Element Plus等技术,全网独发

分类识别任务是计算机视觉中的重要任务,广泛应用于智慧校园分类、智慧农业、智慧生活场景分类等领域。常见的分类模型有 VGGNet、ResNet 、MobileNet 、ConvNeXt、DenseNet、ViT、Swin Transformer、YOLOv8/11/26。本项目结合 ResNet分类识别算法 + LLM大语言模型联动 ,使用 Django + Vue3,构建了一个通用的 Web 前后端系统,用户端 + 管理端 ,便于用户操作检,不仅可以用于大论文的工作量展示,还可以作为毕业设计。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 756

java8 新特性一之 方法引用

第三种 类 :: 实例方法理解比较难,因为调用者是一个实例对象,其实说白了,把实例对象和参数当做函数式接口抽象方法参数列表,这样就可以很好的理解方法引用形参列表和返回值一致的问题。使用要求: 实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。其实方法引用就是 lambda 表达式一个更深层次的表达,可以理解成就是 lambda 表达式的语法糖。当要传递给 lambda 体的操作,已经有实现方法,就可以使用方法引用。对象 :: 实例方法名。类 :: 实例方法名。

Mr. David 专栏 612

uniapp - HBuilder提示adb: failed to install X Failure [INSTALL_ARSE_FAILED_NOT_APK:X(安装HBuilder调试基座失败)

安装HBuilderX调试基座失败,uniapp APP运行到手机adb: failed to install,Uniapp提示adb,uniapp ios 真机调试报错 uniapp安卓调试,Uniapp安装不了基座,手动安装基座,正在安装手机端HBuilder调试基座,点击运行到手机报错信息:基座无法正常安装,Uniapp-安装HBuilder调试基座失败解决方案,解决 HBuilderX 安卓基座安装失败的问题,显示adb报错,UniApp苹果真机运行调试(自定义基座,版本更新后/没有基座打开失败)如

🏆 前端领域优质创作者 8061

学习笔记(9):Java8编程实战-数组的定义与使用(数组与方法的引用操作)

Java一直作为优秀的编程语言活跃于软件开发行业,掌握Java不仅是一件兴奋的事,更是一把可以帮助你轻松进入软件行业大门的一把金钥匙,本套课程将为读者讲解Java8的所有核心技术知识,一共240集的Java8开发课程,全网独一无二的教学视频资料,你还等什么?赶紧来学吧!官方QQ群:612148723。...

qq_39919841的博客 1728

微信小程序(云开发) - 实现微信小程序拼团功能+前后台源码/数据库设计,开团参团、自动成团、微信分享链接URL参与拼团、组团人数/倒计时/实时数据、设置拼团人数限制等(拼团退款处理逻辑、订单同步等)

实现微信小程序云开发拼团功能,云开发小程序--微信拼团设计实现,微信小程序实现秒杀、拼团等效果,微信小程序云开发拼团源码完整版 包含前后台和数据库,拼团商城小程序开发,分销,拼团,社群团购,微信小程序—判断参团人数(设置拼团剩余人数数组)拼多多拼团小程序开发,微信云开发教程怎么实现微信小程序云开发拼团功能?云开发如何实现拼团,拼团小程序怎么弄,微信小程序案例:拼团模块,需要朋友助力,详细源码demo示例,如何做拼团功能,云开发小程序如何做拼团功能,外卖电商拼团,仿拼多多拼团,拼团后退款怎么办,拼团后订单管理

🏆 前端领域优质创作者 4627

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 8新特性实战:深入理解与应用Lambda表达式、Stream API和方法引用

Java 8新特性实战:深入理解与应用Lambda表达式、Stream API和方法引用

juedaifenghua2的博客 634

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 8终极学习指南:7步快速掌握现代Java编程的核心技能 [特殊字符]

Java 8是Java语言发展史上的一个重要里程碑,它为开发者带来了革命性的新特性。无论你是Java编程新手还是希望升级技能的开发者,掌握Java 8都是现代Java开发的必备基础。本指南将为你提供一个完整的学习路径,帮助你快速掌握Java 8的核心概念和实用技巧。 ## 📚 为什么Java 8如此重要? Java 8在2014年发布,引入了许多改变游戏规则的新特性,这些特性不仅简化了代码编

gitblog_00847的博客 527

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java Lambda 表达式详解与经典案例

Java 8引入的Lambda表达式为Java带来了函数式编程能力,不仅简化了代码编写,还提升了集合处理效率。掌握Lambda表达式已成为Java开发者必备的核心技能。本文将全面解析Lambda表达式,从基础语法到函数式接口,并通过十个经典案例展示其实战应用。Lambda表达式是提升Java代码简洁性和开发效率的重要特性,尤其适用于集合操作和行为参数化场景。与Stream API和方法引用配合使用效果更佳。

zhangxzq的博客 988

Proton-GE 安装指南:4 步装好 GE-Proton,从生效验收到按场景调优

Proton-GE(GE-Proton)是一个基于 Wine 的 Steam Play 兼容工具,在官方 Proton 的基础上补上了媒体播放、NVIDIA NVAPI、FSR 缩放和 protonfixes 自动修复等能力。这篇文章带你把 Proton-GE 装进 Steam、确认它真的生效,然后按"视频、输入、图形"三类常见问题做针对性调优。面向的是用 Linux 跑 Steam 游戏的普通玩

gitblog_00411的博客 893

【Java8】 方法引用 讲解

一、概述 在学习 lambda 表达式之后,我们通常使用 lambda 表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下: Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); 在Java8中,我们可以直接通过方法引用来简写lambda 表达式中已经存在的方法。 Arrays.so...

sowhat 3万+

Java 8 - 06 Lambda 和方法引用实战

文章目录Pre第 1 步:传递代码第 2 步:使用匿名类第 3 步:使用 Lambda 表达式第 4 步:使用方法引用 Pre 前几篇文章,我们已经学习了行为参数化、匿名类、Lambda表达式和方法引用,实现了给工程师按照职位排序的功能 enginnerlist.sort(comparing(Enginner::getJob)) 那我们来分解一下,看具体是怎样一步步的实现这么精简的写法的 第 1 步:传递代码 Java 8的API已经为你提供了一个 List 可用的 sort 方法, 这个是最难的部分

小工匠 2万+

【Java8实战】方法引用

引言 通过前面两篇博客的学习,我们对Lambda表达式的语法和使用已经有了一定了解。而本篇博客要总结的是java8的另一功能:方法引用。简单地说,可以把它们视为某些 Lambda的快捷写法。 方法引用是什么 方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下, 比起使用Lambda表达式,它们似乎更易读,感觉也更自然。 第一个方法引用 比如,比较两个苹果重量的例子:...

Dream it Possible 499

Java8的方法引用

目录 一、概述 二、什么是方法引用 三、方法引用例子 四、四种方法引用类型 1、静态方法引用 2、特定实例对象的方法引用 3、任意对象(属于同一个类)的实例方法引用 4、构造方法引用 一、概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下: Arrays.sort(stringsArray,(...

newchitu的博客 399

Java 8 新特性—方法引用和构造器引用

我们先看一个例子。Student 中含有一个静态方法,它是用来比较年龄的。现在需要实现一个需求,有一批学生我们希望能够根据 age 进行排序。new Student("小明",16),new Student("小红",14),new Student("小兰",15),new Student("小李",18),new Student("小张",14),new Student("小林",15)@Override});// 省略代码...。// 省略代码...

smart_an的专栏 934

【Java8新特性】浅谈方法引用和构造器引用

写在前面 Java8中一个很牛逼的新特性就是方法引用和构造器引用,为什么说它很牛逼呢?往下看! 方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!这里需要注意的是:实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致! 那么什么是方法引用呢?方法引用就是操作符“::”将方法名和对象或类的名字分隔开来。 有如下三种使用情况: 对象::实例方法 类::静态方法 类::实例方法 这里,我们可以列举几个示例。 例如: (x) -> System.out

冰河的专栏 1686

Java8之方法引用

一、概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下: Arrays.sort(stringsArray,(s1,s2)-&gt;s1.compareToIgnoreCase(s2)); 在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。 Arrays.sort(str...

weixin_40482816的博客 159
上一篇: Java8 实战学习 — Lambda 表达式
下一篇: 教你如何实现 Splash 页面三秒跳转和动态下载最新背景图
Yoda_wang
博客等级 码龄11年 60粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值