资源描述:
《使用Java8函数式编程生成字母序列》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在Java8中使用函数式编程生成字母序列是一个很大的挑战。LukasEder愉快地接受了这个挑战,他将告诉我们如何使用Java8來牛成ABC的序列——当然,肯定不是-•种蹩脚的方式。我被StackOverflow上网友“mip"提的一个何趣的问题给难住了。该问题是:我正在寻找一•种生成下列字母序列的方式:ArBtCf•••#ZrAArABfAC/ZZ.大家应该能够很快认出这是Excelspreadsheet的头部,准确的样子如下:VwXYzAAl.ABAC
2、ADj到现在为止,没有一个答案是使用Java8的函数式编程实现的,因此我接受此挑战。我将使用
3、jOOX,因为Java8的StreamAPI提供的功能不足以完成该任务(我承认我错了——非常感谢Sebastian対这个问题的有趣解答)。首先,我们用函数的方式分解这个算法。我们所需要的组件有:1、一个(可重复)的字母表。2、一个上界,例如想生成多少个字母。如要求生成序列Z乙那上界就是2。3、一种将了母表中的7母与先前牛成的7母联合成1个笛卡尔积(cartesianproduct)的方法。让我们看一下代码:K生成字母表我们可以这样写入字母表,如:Listalphabet=Arrays.asList('lA111"Zn);但这很差劲。
4、我们使用joox代替:ListvString>alphabet=Seq・rangeClosed(1A',1Z1)・map(Object::toString)・toList();上面的代码生成从字符A到Z的封闭区间(Java・8・Strcam・spcak是包含上边界的),然后将字符映射成字符串,最后将其转换为列表。冃前为止,一切都很好。现在:2、使用上边界:要求的字符序列包括:A・・Z,AAZABZ・・ZZ但是我们应该很容易想到扩展该需求,能生成如下字符序列,或者更多:A••Z#AAfABf••ZZ,AAAfAAB,•・ZZZ因此,我们将再次使用ra
5、ngeClosed()://1=A・・Zt2=AA…ZZ,3=AAA・•ZZZSeq・rangeClosed(1,2)・flatMap(length->•••)・forEach(System・out::printin);这种方法是为范围[1..2]中每个长度生成一个单独的流,然后再将这些流合并到一个流小。flatMapO的本质与命令式编程(imperativeprogramming)屮的嵌套循坏类似。3、合并字母到一个笛卡尔积中这是最棘手的部分:我们需要介并字符及出现的次数。因此,我们将使用如下的流:Seq.rangeClosed(1,length
6、-1)・foldLeft(Seqs・crossJoin(Seq・seq(alphabet))・map(t->t.vl+t・v2))我们再次使用rangeClosed()来生成范
7、i
8、[1..length-1]的值。foldLcft()与reduce()基本一致,区别在于foldLeftO保证在流中的顺序是从“左至右”的,不需要fold函数来关联。另一方面,这是一个共容易懂的词汇:foldLeftO仅代表一条循环的命令。循环的“起源”(即循环的初始化值)是一个完整的字母表(Seq.seq(alphabet)
9、)o现在,在范[1..length-1]中的值生成一个笛卡尔积(crossJoin()),产生一个新的字母表,然后我们将每个合并的字母再组成一个单独的字符串(t.vl与t.v2)o这就是整个过程。将上面的内容合并到一起下面是一个简单的打印A..Z,AA..ZZ,AAA..ZZZ到控制台的程序:importorg.jooq.lambda.Seq;publicclassTest{publicstaticvoidmain(String[]args){intmax=3;Listalphabet=Seq•rangeClosed(1A1,1Z1
10、)・map(Object::toString)•toList();Seq・rangeClosed(1,max)・flatMap(length->Seq.rangeClosed(1,length-1)•foldLeft(Seq.seq(alphabets),(sri)->s.crossJoin(Seq.seq(alphabet))・map(t->t.vl+t.v2)))・forEach(System.out::printin);}}声明对于这个问题,这确实不是故优的算法。在StackOverflow,冇一个匿名用户给出了一种最好实现方法。import
11、staticjava.lang.Math.*;privatestaticStringgetString(intn){cha