如何更简捷地在 Java 中进行函数式编程

本文探讨了Java编程中的命令式、声明式和函数式风格,通过实例展示了如何在findNemo方法中运用这两种风格,并强调了从命令式到函数式编程的过渡。此外,文章还提及了在实际项目中如地图数据结构和面试准备的重要性。
摘要由CSDN通过智能技术生成

import java.util.*;

public class FindNemo {

public static void main(String[] args) {

List names =

Arrays.asList(“Dory”, “Gill”, “Bruce”, “Nemo”, “Darla”, “Marlin”, “Jacques”);

findNemo(names);

}

public static void findNemo(List names) {

boolean found = false;

for(String name : names) {

if(name.equals(“Nemo”)) {

found = true;

break;

}

}

if(found)

System.out.println(“Found Nemo”);

else

System.out.println(“Sorry, Nemo not found”);

}

}

复制代码

findNemo() 方法首先初始化一个标识变量found,这种变量也被称为garbage变量,有些开发者经常将这些变量名称为ft或者temp,表示这些变量只是用来表示中间状态,它们本不该存在,这里则是将其命名位found

接下来程序遍历names列表的每一个元素。它检查这些元素是否与Nemo相匹配,如果匹配则将found置为true并跳出循环,

上面的代码风格可以说是每一位java开发者都熟悉的命令式风格,你定义了程序的每一步,包括迭代哪些元素,如何比较,匹配时执行哪些操作,何时跳出循环等。命令式风格使得你能对程序拥有绝对的控制,这看起来很不错。另一方面,在许多场景下,你可以以此来减少工作量。

声明式风格


在声明式编程下,你仍然需要告诉程序需要做什么,但是实现的细节交给底层的函数库。让我们使用声明式风格来重写上面的findNemo方法:

以声明式的风格实现findNemo

public static void findNemo(List names) {

if(names.contains(“Nemo”))

System.out.println(“Found Nemo”);

else

System.out.println(“Sorry, Nemo not found”);

}

复制代码

对比命令式风格的代码我们注意到,这里没有声明表示标识变量,而且没有使用循环来遍历每个元素。相反。我们直接使用contains()方法来实现了功能。总的来说,虽然你仍然需要告诉程序怎么做:检查集合中是否有我们想要的值,但是实现的细节已经交给底层函数库。

在命令式的代码中,你通过指定遍历操作来指示程序按你的想法来实现功能,但在声明式的版本中,你不用关心实现的过程如何运作,只需关心它返回的结果,根据返回的结果来执行你想要的操作,看起来更加省心。

寻来自己以声明式的风格编程和思考将大大简化你向函数式编程转变的过程。这是因为函数式编程构建于声明式风格之上,而声明式思维提供了从命令式编程到函数式编程的过渡。

函数式风格


虽然函数式编程的风格总是声明式的,但这不代表简单地使用声明式编程就是函数式编程。这是因为函数式编程还需要与高阶函数使用相结合。下面的图示表明了命令式、声明式和函数式编程之间的关系。

A logic diagram showing how the imperative, declarative, and functional programming styles differ and overlap.

Java中的高阶函数

Java中,你可以将对象作为参数传递给方法,在方法中创建对象并返回,对于函数你同样可以这样做:将函数作为参数传入方法中,在方法中处理函数,并将处理后的函数返回。

在这种情况下,方法是类的一部分:静态变量或示例,但是传入的函数只是方法的一个局部变量,不能将它和类本身或者实例关联起来。对于可以接收、处理、返回函数的方法就被称为高阶函数。

一个函数式编程的例子


在程序设计中使用一种新的编程风格需要你改变对程序的看法,你可以通过这个简单示例,来初探如何构建这类风格的更发杂的程序。

目录3:命令式风格的Map

import java.util.*;

public class UseMap {

public static void main(String[] args) {

Map<String, Integer> pageVisits = new HashMap<>();

String page = “https://agiledeveloper.com”;

incrementPageVisit(pageVisits, page);

incrementPageVisit(pageVisits, page);

System.out.println(pageVisits.get(page));

}

public static void incrementPageVisit(Map<String, Integer> pageVisits, String page) {

if(!pageVisits.containsKey(page)) {

pageVisits.put(page, 0);

}

pageVisits.put(page, pageVisits.get(page) + 1);

}

}

复制代码

在目录3 中,main函数创建了一个HashMap对象实例,用于保存网站及其对应的访问次数。同时incrementPageVisit()方法用于增加指定页面的访问次数,我们接下来重点介绍这个方法。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中…(img-RCTdJ0Ab-1713634964399)]

[外链图片转存中…(img-tWMFGYAc-1713634964399)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值