使用Java 8函数式编程生成字母序列

在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战。Lukas Eder 愉快地接受了这个挑战,他将告诉我们如何使用 Java 8 来生成ABC的序列——当然,肯定不是一种蹩脚的方式。

我被 Stack Overflow 上网友“mip”提的一个有趣的问题给难住了。该问题是:

到现在为止,没有一个答案是使用 Java 8 的函数式编程实现的,因此我接受此挑战。我将使用 jOOλ,因为 Java 8 的 Stream API 提供的功能不足以完成该任务(我承认我错了——非常感谢 Sebastian 对这个问题的有趣解答)。

首先,我们用函数的方式分解这个算法。我们所需要的组件有:

1、一个(可重复)的字母表。

2、一个上界,例如想生成多少个字母。如要求生成序列ZZ,那上界就是2。

3、一种将字母表中的字母与先前生成的字母联合成一个笛卡尔积(cartesian product)的方法。

让我们看一下代码:

1、生成字母表

我们可以这样写入字母表,如:

上面的代码生成从字符 A 到 Z 的封闭区间(Java-8-Stream-speak 是包含上边界的),然后将字符映射成字符串,最后将其转换为列表。

目前为止,一切都很好。现在:

2、使用上边界:

要求的字符序列包括:

这种方法是为范围[1..2]中每个长度生成一个单独的流,然后再将这些流合并到一个流中。flatMap() 的本质与命令式编程(imperative programming)中的嵌套循环类似。

3、合并字母到一个笛卡尔积中

这是最棘手的部分:我们需要合并字符及出现的次数。因此,我们将使用如下的流:

我们再次使用 rangeClosed() 来生成范围 [1 .. length-1] 的值。foldLeft() 与 reduce() 基本一致,区别在于 foldLeft() 保证在流中的顺序是从“左至右”的,不需要 fold 函数来关联。

另一方面,这是一个共容易懂的词汇:foldLeft() 仅代表一条循环的命令。循环的“起源”(即循环的初始化值)是一个完整的字母表(Seq.seq(alphabet))。现在,在范围[1..length-1] 中的值生成一个笛卡尔积(crossJoin()),产生一个新的字母表,然后我们将每个合并的字母再组成一个单独的字符串(t.v1 与 t.v2)。

这就是整个过程。

将上面的内容合并到一起

下面是一个简单的打印 A .. Z, AA .. ZZ, AAA .. ZZZ 到控制台的程序:

不用说,这个算法比之前的函数式算法会快很多。

原文链接: jaxenter 翻译: ImportNew.com - paddx

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2015-10-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JackieZheng

初探JavaScript(四)——作用域链和声明提前

前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活。往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望...

21150
来自专栏书山有路勤为径

分治算法之归并排序

分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同。求出子问题的解后进行合并,就可得到原问题的解。

9210
来自专栏数据结构与算法

P1077 摆花

题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多...

35180
来自专栏小樱的经验随笔

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮...

41170
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day3 Java基本数据类型

  前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处...

24480
来自专栏阿凯的Excel

文本数字拆分技巧

Excel处理人员呢,最喜欢的就是规范化的表,那什么样子的表是规范的呢?给大家个图片感受一下! ? 今天的要和大家分享的就是和规范化图表格格不入的,需要由不规...

36160
来自专栏小樱的经验随笔

CTF---编程入门第一题 循环

循环分值:10 来源: 北邮天枢战队 难度:易 参与人数:1478人 Get Flag:467人 答题人数:523人 解题通过率:89% 给出一个循环公式,对于...

396110
来自专栏小樱的经验随笔

【Java学习笔记之十三】初探Java面向对象的过程及代码实现

理解Java面向对象的重要知识点: 一、 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的、红色的、白色的... ...

35660
来自专栏令仔很忙

C#----委托和事件(一)

最近在做的项目,正在进行重构,之前的框架就是纯三层的简单调用,外加一些Session,SQLHelper等封装管理类,其他的东西,一直也想去抽象,但是奈何能力...

87310
来自专栏阿凯的Excel

筛选功能(Pandas读书笔记9)

今天和大家分享如果使用Pandas实现单、多条件筛选、模糊筛选。 还是老套路,我们需要先读取一组数据作为测试文件。 测试文件使用读书笔记7的材料,传送门如下: ...

1.6K60

扫码关注云+社区

领取腾讯云代金券