资讯专栏INFORMATION COLUMN

Java8-4-stream api和函数式编程简单应用

roadtogeek / 1255人阅读

摘要:所以通过上面的例子可以看出函数式编程和结合的非常紧密。小结本篇简单介绍了函数式编程与应用及类方法引用的使用,表达式让老版本的代码更简洁,方法引用让表达式更简洁,实际上就是表达式的一种语法糖。

上一篇文章中,我们介绍了几个Java8内置的函数式接口的特点和使用方式,并在最后引出了stream api的知识点,接下来我们开始学习Java8中的stream api。
先假设一个简单的需求,存在一个字符串集合,我们想把所有长度大于5的字符串转换成大写输出到控制台,之前我们可能会直接这么做

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).length() > 5){
                System.out.println(list.get(i).toUpperCase());
            }
        }
    }
}

现在换成使用stream api看下

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(s -> s.toUpperCase()).forEach(System.out::println);
    }
}

1行代码直接搞定,而且这种链式编程风格从语义上看逻辑很清晰。
stream方法先构造了一个该集合的Stream对象,filter方法取出长度大于5的字符串,map方法将所有字符串转大写,forEach输出到控制台。我们可以对照Stream接口的源码片段看下这几个stream api的定义

public interface Stream extends BaseStream> {
    
    Stream filter(Predicate predicate);
    
     Stream map(Function mapper);
    
    void forEach(Consumer action);
    .
    .省略
    .
}

filter方法,接收一个Predicate函数式接口类型作为参数,并返回一个Stream对象,从上一篇我们知道可以由一个接收一个参数返回布尔类型的lambda表达式来创建Predicate函数式接口实例,所以看到filter接收的参数是s -> s.length() > 5

map方法,接收Function函数式接口类型,接收一个参数,有返回值s -> s.toUpperCase() 正是做了这件事情

forEach方法,接收Consumer函数式接口类型,接收一个参数,不返回值 这里使用方法引用的其中一种形式System.out::println来创建了Consumer实例。

所以通过上面的例子可以看出函数式编程和stream api结合的非常紧密。大家应该也注意到了在介绍每个方法时,我们提到了有中间操作和终止操作,终止操作意味着我们需要一个结果了,当程序遇到终止操作时才会真正执行。中间操作是指在终止操作之前所有的方法,这些方法以方法链的形式组织在一起处理一些列逻辑,如果只有中间操作而没有终止操作的话即使运行程序,代码也不会执行的

实际上map方法中可以使用另一种方法引用的形式来处理,类方法引用。语法:类名::方法名

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).forEach(System.out::println);
    }
}

之前介绍的System.out::println这种属于对象方法引用,类方法引用的应用也是很广泛的。只是理解起来需要花费些时间,map方法接收一个Function函数式接口的实现,那就肯定需要一个输入并且有一个输出,但是我们看下toUpperCase方法的定义

public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}

有返回值,但是没有入参,乍一看也不符合Function接口中apply方法的定义啊。这也是类方法引用的特点,虽然toUpperCase没有明确的入参,因为此时toUpperCase的输入是调用它的那个对象,编译器会把调用toUpperCase方法的那个对象当做参数,也就是lambda表达式s -> s.toUpperCase()中的s参数。所以也满足一个输入一个输出的定义。

小结:本篇简单介绍了函数式编程与stream api应用及类方法引用的使用,lambda表达式让老版本的代码更简洁,方法引用让lambda表达式更简洁,实际上就是lambda表达式的一种语法糖。

下一篇

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70674.html

相关文章

  • 攻克前端javascript面试:什么是函数编程

    摘要:仅在几年以前,仅有少数的程序员知道函数式编程是什么。函数式编程是声明性的而不是命令式的应用状态流经纯函数中。函数式编程是一种编程模式。在理解软件是如何使用函数式编程构建时,理解函数组合是非常重要的一步。不可变性是函数式编程的核心概念。 函数式编程已然变成了一个javascript语言中一个非常热门的话题。仅在几年以前,仅有少数的js程序员知道函数式编程是什么。但是在过去三年中,我所见过...

    wslongchen 评论0 收藏0
  • 函数编程思维在三行代码情书中的应用

    摘要:函数式编程概述如今主流的编程语言,函数式编程范式或多或少都融入其中成了标配,或者说主流语言都在进行函数式方面的扩充,这是一个大趋势。 showImg(https://segmentfault.com/img/remote/1460000015089083); 函数式编程概述 如今主流的编程语言,函数式编程范式或多或少都融入其中成了标配,或者说主流语言都在进行函数式方面的扩充,这是一...

    DC_er 评论0 收藏0
  • Js-函数编程

    摘要:组合组合的功能非常强大,也是函数式编程的一个核心概念,所谓的对过程进行封装很大程度上就是依赖于组合。在理解之前,先认识一个东西概念容器容器为函数式编程里普通的变量对象函数提供了一层极其强大的外衣,赋予了它们一些很惊艳的特性。 前言 JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP(函数式),由于笔者最近在学习React相关的技术栈,想进一步深入了解其思想...

    whinc 评论0 收藏0
  • 翻译连载 | JavaScript 轻量级函数编程-第3章:管理函数的输入 |《你不知道的JS》姊

    摘要:但是,对函数式编程而言,这个行为的重要性是毋庸置疑的。关于该模式更正式的说法是偏函数严格来讲是一个减少函数参数个数的过程这里的参数个数指的是希望传入的形参的数量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是...

    xiaowugui666 评论0 收藏0
  • Rxjs 响应编程-第六章 使用Cycle.js的响应Web应用程序

    摘要:我们将使用,这是一个现代,简单,漂亮的框架,在内部使用并将响应式编程概念应用于前端编程。驱动程序采用从我们的应用程序发出数据的,它们返回另一个导致副作用的。我们将使用来呈现我们的应用程序。仅采用长度超过两个字符的文本。 Rxjs 响应式编程-第一章:响应式Rxjs 响应式编程-第二章:序列的深入研究Rxjs 响应式编程-第三章: 构建并发程序Rxjs 响应式编程-第四章 构建完整的We...

    EastWoodYang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<