从目前为止,如果不算html,css,sql这类的编程语言(领域特定语言,简称DSL),我一共完整的学习了两门主流的编程语言(通用编程语言,简称GPL),一个是现在靠他吃饭的家伙javascript,另一个是已经很久没写的java,因为我司后台是C#.net架构,也在后端同事的影响下开始学习大名鼎鼎的C#,同时为了拾起荒废已久的java,我把这两种语言实现同一种功能的代码都贴出来,同时加上javascript作为起头。
问题描述:把一个定长的自然序列做映射,如果是奇数就取三次方,如果是偶数就取平方
在不考虑语言特性的情况下有一个通用方法,就是用for/while迭代数组做遍历赋值,这是大部分GPL早期的写法,现在有了谷歌的map/reduce之后完全可以这么写
<!-- javascript es5 -->
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
var result = nums.map(
function (x) {
if (x % 2 == 0) {
return x * x;
}
else {
return x * x * x;
}
}
)
console.log("数组视图:", result);
数组视图: (14) [1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196]
这用到了js的Array对象原型中的高阶函数map,它接受一个回调函数作为参数,迭代元素并返回一个新的数组,那么在java里面又是什么情况呢
<!-- java8 -->
int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
IntStream is = Arrays.stream(nums).map(new IntUnaryOperator() {
@Override
public int applyAsInt(int x) {
if (x % 2 == 0) {
return x * x;
} else {
return x * x * x;
}
}
});
String arrayView = Arrays.toString(is.toArray());
System.out.print("数组视图:");
System.out.println(arrayView);
数组视图:[1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196]
java中的数组对象没有map这个方法,需要用到stream(注意他不是IO中的流,只是借用了这个概念) ,同时使用回调接口对象做迭代操作,虽然看起来代码变多了,但是这个IntUnaryOperator实例换成lamda表达式就和js中的回调函数差不多,其他stream对象查API就行了,IDEA会给出提示不需要记忆,不能直接打印数组,所以要转成字符串,然后就是主角C#
<!-- C# .net 6.0 -->
int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
int[] result = nums.Select(selector: x => {
if (x % 2 == 0) {
return x * x;
}
else {
return x * x * x;
}
}).ToArray();
Console.Write("数组视图:");
Console.WriteLine(String.Join(',', result));
数组视图:1,4,27,16,125,36,343,64,729,100,1331,144,2197,196
以我的角度来看C#的写法是最奇怪的,他用到了类似于sql里面select写法,与之类似的方法还有Groupby,Orderby,Where等等,还有一点比较怪的是,对象可以调用static方法并且把自身当成参数,在java中static方法只能由类调用,但是后面就是比较熟悉的回调函数,这种新的语法叫做linq,另外VS的语法提示也是很强大的,可以自动生成自然序列,快捷键要按几下感觉有点别扭,后面继续学习linq