首先确认什么事函数式编程,也就是只需要关心需要什么,不要关注如何实现。函数式编程更多的是思想上
举个例子,找一个最小值:
int[] nums = {1,2,3,4,5,6}; int min = Integer.MAX_VALUE; System.out.println("before :" + min); // 命令式编程 for(int i: nums){ if(i < min){ min = i; } } System.out.println("after :" + min); // 函数式编程 int min2 = IntStream.of(nums).min().getAsInt(); System.out.println("min2 :" + min2); // 如果需要开启多线程 int min3 = IntStream.of(nums).parallel().min().getAsInt(); System.out.println("min3 " + min3); }
before :2147483647 after :1 min2 :1 min3 1
lambda匿名函数,可以帮助简化代码,是jdk8加入的强大的功能,解决了长期java被人诟病代码重复的问题,定义一个方法接口,里面一般只有一个方法,因此我们在定义接口是,可以尽量接口单一,可以通过继承方式来实现多接口,lambda表达式帮助我们返回一个接口的实例,可以直接使用进行调用,同时jdk8加入新特性,也就是可以定义默认方法,一般接口的所有方法必须全部实现,使用默认方法可以无需实现,这样如果需要修改接口的话,直接添加默认方法,其实现类照样可以正常运行
@FunctionalInterface interface DoubleNum{ int doubleNum(int i); default int sum(int x, int y){ x = this.doubleNum(x); return x + y; } } public class Lambda { public static void main(String[] args) { // lambda DoubleNum d1 = (i) -> i *2; // 常用写法 DoubleNum d2 = i -> i * 3; DoubleNum d3 = i -> { return i*2; }; System.out.println(d1.doubleNum(2)); // 4 System.out.println(d1.sum(2, 2)); // 6 System.out.println(d2.doubleNum(3)); // 9 System.out.println(d2.sum(3, 3)); // 12 System.out.println(d3.doubleNum(4)); // 8 System.out.println(d3.sum(4, 4)); // 12 } }