`
deepinmind
  • 浏览: 450836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41555
社区版块
存档分类
最新评论

Java函数式编程(八)Optional

阅读更多

本系列文章译自Venkat Subramaniam的Functional Programming in Java

未完待续,后续文章请继续关注Java译站

选取单个元素

直觉来说选取单个元素肯定会比选取多个要简单得多,不过这里也存在一些问题。我们先看下一般的做法的问题是什么,然后再看下如何用lambda表达式来解决它。

我们先新建一个方法来查找一个以特定字母开头的元素,然后打印出来。

public static void pickName(
final List<String> names, final String startingLetter) {
String foundName = null;
for(String name : names) {
if(name.startsWith(startingLetter)) {
foundName = name;
break;
}
}


这个方法简直跟刚过去的垃圾车一样臭不可闻。我们先是新建了一个foundName的变量,然后初始化成null——这个就是恶臭之源。我们不得不检查是否为空,不然的话就会抛出一个NullPointerException或者一个错误响应。我们还用了一个外部迭代器来循环列表,如果找到了想要的元素之后还得跳出这个循环,这又加重了原来的臭味:基本类型偏执,命令式风格,可变性,全齐活了。一旦退出循环后,我们还得先检查下结果,然后才能进行打印。这么点任务居然写了这么长的代码。

我们来重新分析下这个问题。我们只是希望能选出第一个匹配的元素,并且能安全的处理不存在这样一个元素的情况。我们来用lambda表达式重写一下这个pickName方法。

public static void pickName(
final List<String> names, final String startingLetter) {
final Optional<String> foundName =
names.stream()
.filter(name ->name.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("A name starting with %s: %s",
startingLetter, foundName.orElse("No name found")));
}


JDK里面一些强大的功能使得这段代码更得非常简洁。首先我们用filter方法获取了所有满足条件的元素,然后用了Stream类的findFirst方法选取出了返回集合的第一个元素。这个方法返回的是一个Optional对象,这就是Java里面官方认证的null变量的除臭剂。

Optional类非常有用,你不用管结果是不是存在。它使得我们免受空指针异常的烦恼,并且更明确的指明了没有结果也是一种可能的结果。通过isPresent()方法我们可以知道结果是不是存在,想获取结果值的话可以使用get()方法。我们还可以使用(这个方法名能让你震惊)orElse方法给它设置一个默认值,就像前面代码里的那样。

我们用之前一直在用的friends集合来验证下我们这个pickName方法。

pickName(friends, "N");
pickName(friends, "Z");


这段代码选取出第一个匹配的元素,如果没找到,打印出一个友好的提示信息。

A name starting with N: Nate
A name starting with Z: No name found


findFirst()方法和Optinal类的结合使用减少了我们的代码量,并且看起来感觉还不错。不过Optional类的功能远不止这些。比如说,除了当对象不存在的时候能提供一个默认值外,如果结果存在的话还可以用它来运行一段代码,或者一个lambda表达式,像这样:

foundName.ifPresent(name -> System.out.println("Hello " + name));


跟命令式的选取第一个匹配名字的代码比起来,流式的优雅的函数式风格看真来更棒一些。不过这个调用流的版本里是不是做的事情有点太多了(译注:先选出了所有匹配的再返回第一项)?当然不是,这些方法非常智能,它们可以按需工作(在后面113页的Stream的惰性求值中我们会深入探讨这点)。

选取单个元素的例子展示了JDK库更多强大的功能,下面我们来看下lambda表达式如何根据一个集合,来求出一个想要的值。


未完待续,后续文章请继续关注Java译站


原创文章转载请注明出处:http://it.deepinmind.com


1
0
分享到:
评论

相关推荐

    Java-Java函数式编程教程

    Java函数式编程是一种编程范式,它强调使用函数作为程序的基本构建块,将计算视为函数的组合,并且尽可能避免改变状态和可变数据。在Java 8及更高版本中,函数式编程得到了官方的大力支持,引入了Lambda表达式、...

    《Java函数式编程》_高清华.zip

    Java函数式编程是一种将函数作为一等公民的编程范式,它强调使用函数来构造程序,减少副作用,提高代码的可读性和可维护性。在Java 8及更高版本中,函数式编程得到了显著增强,引入了Lambda表达式、函数接口、Stream...

    java函数式编程

    Java函数式编程是一种编程范式,它将计算视为数据处理,并强调程序的数据流和变换,而不是对指令进行控制。在Java 8及更高版本中,函数式编程得到了强大的支持,引入了Lambda表达式、Stream API以及函数式接口等概念...

    Java 8函数式编程.rar

    Java 8是一个重要的Java语言版本,它引入了对函数式编程的支持,极大地提升了代码的简洁性和可读性,特别是对于集合操作。函数式编程是一种编程范式,它将计算视为函数的组合,而不是状态的改变或控制流程。在Java 8...

    java lambda函数式编程完成实例代码

    在Java 8中,许多集合API如`Stream`、`Optional`等都进行了函数式编程的增强。通过Lambda表达式,我们可以方便地对集合进行过滤、映射、归约等操作。例如,以下代码展示了如何使用Lambda表达式过滤出一个整数列表中...

    java 8 函数式编程 (源码)

    Java 8 是一个重要的Java版本,它引入了函数式编程的概念,极大地扩展了语言的功能,使得Java开发者可以采用更加简洁、高效的方式来编写代码。Richard Warburton 的《java 8 函数式编程》是一本深入解析这一主题的...

    深入理解Java函数式编程和Streams API

    ### 深入理解Java函数式编程和Streams API #### 一、引言 随着Java 8的发布,函数式编程范式正式被引入到Java语言中,这标志着Java编程方式的重大转变。Java 8引入了Lambda表达式、方法引用等新特性,使得Java能够...

    Java 8函数式编程 范例

    Java 8是Java语言的一个重要版本,引入了大量新特性,其中最具革命性的就是函数式编程的支持。函数式编程在Java 8中的实现主要体现在Lambda表达式、Stream API以及方法引用等方面,这些新特性极大地提高了代码的简洁...

    Java函数式编程(六):Optional

    Java函数式编程中的`Optional`是一个重要的工具,用于处理可能出现的缺失值,它引入了更加安全和明确的方式来处理`null`。在传统的编程中,`null`常常导致空指针异常(`NullPointerException`),而`Optional`则为...

    Java函数式编程.rar

    Java函数式编程是一种编程范式,它将计算视为函数的评估,强调数据的无副作用处理和函数的纯粹性。在Java 8及更高版本中,函数式编程得到了大力支持,引入了Lambda表达式、函数接口和Stream API等核心特性,极大地...

    Java 8函数式编程1

    【Java 8函数式编程】 Java 8 是Java平台的一个重大更新,引入了多项新特性,其中最引人注目的就是对函数式编程的支持。函数式编程是一种编程范式,它强调程序的数据处理过程如同数学函数般进行计算,而不是通过...

    函数式编程思想

    在Java世界中,虽然它最初设计为命令式语言,但自Java 8以来,已经引入了丰富的函数式编程特性,使得开发者能够充分利用这种编程风格。 **函数作为一等公民** 在函数式编程中,函数是第一等公民,意味着函数可以被...

    基于Java 8的函数式编程学习项目.zip

    本项目是基于Java 8的函数式编程学习项目,主要涵盖了Java 8中引入的Stream API、Lambda表达式、函数式接口、Optional类、时间API等特性。通过多个示例文件,展示了如何利用这些新特性进行高效、简洁的编程。 主要...

    java代码-java函数式编程

    Java函数式编程是Java 8引入的一项重要特性,它极大地扩展了Java语言的功能,使得开发者可以采用更加简洁、高效的方式处理问题。函数式编程的核心思想是将计算视为函数的求值,强调数据的不可变性,避免副作用,以及...

    Java 8函数式编程学习笔记.zip

    Java 8是Java语言的一个重要版本,引入了大量新特性,其中最具革命性的就是函数式编程的支持。函数式编程是一种编程范式,它强调将计算视为函数的组合,避免可变状态和副作用,使得代码更加简洁、易于测试和并行化。...

    java8函数式编程学习源码

    Java 8 是一个重要的 Java 发布版本,引入了许多新特性,极大地改变了 Java 开发的方式,尤其是函数式编程的引入。本资源"java8函数式编程学习源码"显然是为了帮助开发者深入理解并实践这些概念。下面我们将详细探讨...

    Java中的函数式编程:简化代码与提升效率

    Java中的函数式编程特性,如Lambda表达式、函数式接口、Stream API和Optional类,为开发者提供了一种更简洁、更声明式的方式来处理数据和任务。这些特性不仅简化了代码,还提高了代码的可读性和开发效率。随着Java...

    函数式编程-haskell-to-java

    ### 函数式编程:Haskell到Java的转换 #### 概述 本文旨在探讨函数式编程语言Haskell如何被编译或转换为Java语言。Haskell作为一种纯函数式编程语言,以其强大的类型系统、惰性求值机制以及高度抽象的能力在学术界...

    Java 什么是函数式编程.pdf

    在Java编程中,函数式编程是一种重要的编程范式,它强调使用函数作为一等公民,即将函数视为可赋值、可传递和可存储的数据。在Java 8中,为了引入函数式编程,引入了Lambda表达式和Stream API,极大地提升了代码的...

    Java 8新特性之Lambda与函数式编程.zip

    Java 8是Java语言发展的一个重要里程碑,引入了许多新的特性,其中最为显著的当属Lambda表达式和函数式编程的支持。这些新特性极大地提升了Java在处理并发和简化代码方面的效率,使得Java更加现代化,能够更好地适应...

Global site tag (gtag.js) - Google Analytics