Lambda表达式与“::“方法引用 & 判空包装类Optional

这篇具有很好参考价值的文章主要介绍了Lambda表达式与“::“方法引用 & 判空包装类Optional。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数式接口

  • 函数式接口(Functional Interface)就是有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
  • 函数式接口可以被隐式转换为Lambda表达式。

Lambda表达式与"::"方法引用

  • 方法引用主要是对Lambda表达式的一种优化!
  • 方法引用的使用前提是对象和方法都是已经存在的!
  • 方法引用提供了一种引用而不执行方法的方式。
  • 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些方法引用是一种更简洁易懂的Lambda表达式!
  • 这种双冒号"::"的写法被称为"方法引用",双冒号"::"也被称为方法引用符或引用计算符,而它所在的表达式被称为方法引用~!
package com.gch.method.references;

/**
 * 定义一个打印的函数式接口
 */
@FunctionalInterface
public interface Printable {
    /**
     * 定义一个打印字符串的抽象方法
     * @param str
     */
    void print(String str);
}
package com.gch.method.references;

/**
 * 方法引用 & Lambda表达式
 */
public class PrintableDemo {
    /**
     * 主函数
     * @param args
     */
    public static void main(String[] args) {
        /**
         * 分析:Lambda表达式的目的,打印参数传递的字符串
         * 把参数s传递给了System.out对象,调用out对象中的方法println()对字符串进行了输出!
         * 注意:
         *   1.System.out对象是已经存在的;
         *   2.println()方法也是已经存在的!
         * 所以我们可以使用方法引用来优化Lambda表达式!
         * 可以使用System.out直接引用(调用)println()方法
         */
        // 调用printString()方法,方法的参数Printable是一个函数式接口,所以可以传递Lambda表达式
        printString((s) -> {
            System.out.println(s);
        });

        /**
         * 方法引用:使用对象来直接引用方法!
         * "::"就是方法引用的运算符
         */
        printString(System.out::println);
    }

    /**
     * 定义一个方法,参数传递Printable接口,对字符串进行打印
     * @param p Printable接口
     */
    public static void printString(Printable p){
        p.print("Hello World!");
    }
}

判空包装类 - Optional

  • Java 8还新增了一个非常重要的判空包装类Optional,这个类可以很有效的处理空指针问题!
比如对于下面这样一个很简单的方法,如果我们在传入参数时,传个null进去,运行时会报错 - 空指针异常 - java.lang.NullPointerException:
package com.gch.optional.demo;

public class Test {
    public static void main(String[] args) {
        // java.lang.NullPointerException
        test(null);
    }

    /**
     * 传入一个字符串,如果字符串不为空,那就打印它的长度!
     * @param str 传入的字符串
     */
    private static void test(String str) {
        if (!str.isEmpty()) {
            System.out.println("字符串长度为:" + str.length());
        }
    }
}
因此,我们还需要在使用之前判断字符串是否为null:
package com.gch.optional.demo;

public class Test {
    public static void main(String[] args) {
        test(null);
    }

    /**
     * 传入一个字符串,如果字符串不为空,那就打印它的长度!
     * @param str 传入的字符串
     */
    private static void test(String str) {
        // 如果字符串为null,则直接结束方法!
        if(str == null) {
            return;
        }
        if (!str.isEmpty()) {
            System.out.println("字符串长度为:" + str.length());
        }
    }
}

虽然这种方式很好,但是在Java 8之后,有了Optional类,它可以更加优雅的处理这种问题:

package com.gch.optional.demo;

import java.util.Optional;

/**
 * 判空包装类 - Optional的用法
 */
public class OptionalDemo {
    public static void main(String[] args) {
        test(null);
    }

    /**
     * 传入一个字符串,如果字符串不为Null,则打印它的长度
     * @param str 传入的字符串
     */
    private static void test(String str){
        Optional // 将传入的对象包装进Optional中
                .ofNullable(str)
                // 如果不为null,则执行这里的Consumer实现!
                .ifPresent(s -> System.out.println("字符串长度为:" + s.length()));
    }
}
private static void test(String str) {
        // get方法可以获取被包装的对象引用,如果被包装的对应为null
        // 则get()方法获取时会抛出异常 - java.util.NuSuchElementException
        String s = Optional.ofNullable(str).get();
    }


 文章来源地址https://www.toymoban.com/news/detail-738443.html

到了这里,关于Lambda表达式与“::“方法引用 & 判空包装类Optional的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式

    在C++11之前,我们只有引用的概念,没有接触到所谓的左值引用或者是右值引用这种概念,从C++11开始,增加了右值引用的概念,那么现在我们将对引用进行一个概念上的区分。在此之前我们所说的引用都是左值引用,对于左值引用相关的内容,可以去看一看博主之前写的文章

    2024年02月15日
    浏览(57)
  • C# 匿名方法和Lambda表达式

    1.匿名方法的演变 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法,从而用匿名方法更为方便。 下面一段代码是声明并使用了一

    2024年02月15日
    浏览(45)
  • CSharp的lambda表达式匿名类扩展方法

    之前已经写过一些关于委托还有事件的文章,今天就来介绍一下lambda表达式。 首先定义需要的函数以及委托 在.net farmwork 1.0,会这样写我们的匿名函数 在.netframework 2.0,会这样写匿名函数, 增加了一个delegate 在.netframework3.0,去掉了delegate了,在参数后增加了一个=

    2024年03月14日
    浏览(81)
  • C#学习相关系列之匿名方法和Lambda表达式

            匿名方法 顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。( Lambda 表达式 的本质也是 匿名方法

    2024年02月07日
    浏览(54)
  • 【javaSE】 Lambda表达式与Lambda表达式的使用

    Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression) ,基于数学中的λ演算得名,也

    2024年02月08日
    浏览(62)
  • JAVA8-lambda表达式8:在设计模式-模板方法中的应用

    JAVA8-lambda表达式1:什么是lambda表达式 JAVA8-lambda表达式2:常用的集合类api JAVA8-lambda表达式3:并行流,提升效率的利器? JAVA8-lambda表达式4:Optional用法 java8-lambda表达式5:toMap引发的线上故障 JAVA8-lambda表达式6:重构和定制收集器 JAVA8-lambda表达式7:重要的函数接口 最近在公司

    2024年02月14日
    浏览(52)
  • Java 8及以上新特性:Lambda表达式、Stream API、Optional类与接口默认方法(四)

    目录 一、接口默认方法 1.1 概念解析: 1.2 应用场景: 1.3 使用注意事项: 1.4 使用示例: 二、结论 1.1 总结Java 8及以上版本四大新特性的重要意义与价值: 1.2 鼓励读者积极学习并运用这些新特性: 1.3 对未来Java版本可能引入的新特性进行展望: 1.1 概念解析: 接口默认方法

    2024年04月13日
    浏览(42)
  • Python tkinter bind三种方法传参,不用lambda表达式也可以(任何人都会)

    很多人都有过这样的疑惑:如何在tkinter 里面传参?比如创建了一个列表,需要对列表中的每一项绑定方法;比如有多个相似的按钮想要一次性完成,这个时候不得不传递参数。 但是Python 语言又非常讨厌的没有给传递参数的空间,bind 方法只能传函数,而不能传参数是真的讨

    2024年02月09日
    浏览(42)
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口         1.4 在具体代码中来操作一下         2.0 Lambda 表达式省略规则          Lambda 表达

    2024年02月08日
    浏览(55)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包