这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
函数式编程
什么是函数式编程,函数式编程是一种编程范式,与命令式编程不同的点在于 :函数式编程关心数据的映射,命令式编程关心解决问题的步骤,但是我没找到最标准的定义,但是我个人认为但是对于java来说 我们熟练使用 stream api 和 lambda表达式就代表会用函数式编程了。
一点代码
一个串数字中选出其中的最小值: 各位会写代码的大佬自然会写个min函数之类的方法来解决这个问题。
public class min {
public static void main(String[] args) {
int [] nums = {22,-55,90,-666,55,95};
int min = Integer.MAX_VALUE;
for (int i:nums){
if (i<min){
min = i;
}
}
System.out.println(min);
}
}
但是不一定会写代码的大佬的女朋友们(真的存在吗)一般会怎么解决呢?
大概会用类似表格一类的工具吧。 我个人认为这就是某种函数式编程,不去关心怎么实现,却得到了具体的结果。
函数式代码
int min2 = IntStream.of(nums).min().getAsInt();
System.out.println(min2);
升级一点难度
现在这串数字给个都很大,而且特别长有几亿条。for循环性能不达标。
那么我们该怎么做呢?
一般来说多线程该上一下吧,创一个线程池,参考快排,分而治之递归的拆分数组。 或者用一些topK算法哈希表加上部分排序等等,总之月薪10几k的小菜鸟只能在面试的时候写出来:-)。(其他实现方式欢迎大佬评论区补充)
看到都知道真正写出来,代码会比较复杂。所有的细节自己去做,而且不要出错。
但是函数式编程可以直接调用一个函数
int min3 = IntStream.of(nums).parallel().min().getAsInt();
System.out.println(min3);
关于 parallel() 源码中是这么介绍的
/**
* Returns an equivalent stream that is parallel. May return
* itself, either because the stream was already parallel, or because
* the underlying stream state was modified to be parallel.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @return a parallel stream
*/
试试lambda表达式
使用 lambda 之前起个线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ok");
}
}).start();
之后
new Thread(()-> System.out.println("ok")).start();
有参函数编写
public class LambdaDemo1 {
interface Interface1{
int doubleNum(int i);
}
public static void main(String[] args) {
Interface1 i1 = (i) ->i * 2;
//最常见写法
Interface1 i2 = i->i*2;
Interface1 i3 = (int i)->i*2;
Interface1 i4= (int i)->{
System.out.println("----");
return i*2;
};
}
}
以上是比较常见的 4种写法,个人推荐第二种