本篇主要讲解 lambda表达式的入门,涉及为何使用函数式编程,以及jdk8提供的函数式接口 和 接口的默认方法 等等编程
命令式编程就是咱们去告诉程序如何实现segmentfault
好比在一堆数字中寻找最小值多线程
int[] nums = {33, 44, 55, -111, -1}; int minNum = Integer.MAX_VALUE; for (int num : nums) { if (num < minNum) { minNum = num; } } System.out.println(minNum);
这段代码就是命令式编程,咱们去告诉程序如何从一堆数字中找到最小值并发
它不是一种具体的技术,是一种方法论,使用对应提供的函数进行编程,而不是去关心内部的实现app
好比在一堆数字中寻找最小值ide
int[] nums = {33, 44, 55, -111, -1}; int min = IntStream.of(nums).min().getAsInt(); System.out.println(min);
IntStream.of(nums).min() 中就是面向函数式编程,你不须要去实现具体的逻辑,只须要简单调用函数式编程
好比在一堆数字中寻找最小值函数
当这堆数字很大的时候,咱们须要去实现多线程去比较的话,须要考虑多线程,线程池以及拆分数据,实现快排等。。
可是当咱们使用JDK8函数式编程的时候能够直接使用一个方法开启 并行 .parallel()学习
int min = IntStream.of(nums).parallel().min().getAsInt();网站
能够明显看出来函数式编程代码简洁了不少
int[] nums = {33, 44, 55, -111, -1}; 函数式编程: int min = IntStream.of(nums).parallel().min().getAsInt(); 命令式编程: int minNum = Integer.MAX_VALUE; for (int num : nums) { if (num < minNum) { minNum = num; } } System.out.println(minNum);
在Java中咱们建立线程会使用这种方式,弄一个匿名内部类去实现Runnable接口,可是线程执行的核心代码 只是run方法里面的
可是咱们须要用这么多行代码去实现,实在不是很友好
new Thread(new Runnable() { @Override public void run() { System.out.println("lambda 初识"); } }).start();
lambda表达式的方式 实现建立一个线程
new Thread(() -> System.out.println("lambda 初识")).start();
能够看出来比上面匿名内部类要简单不少
在Java8中用使用 -> 函数来编写lambda表达式, lambda表达式会返回一个函数
Runnable runnable = () -> System.out.println("lambda 初识");
lambda表达式不关心你要实现的是什么接口,只是关心你的入参和返回值 ,以下
interface MyFunction{ void hello(); } MyFunction myFunction = () -> System.out.println("lambda 初识");
函数式接口是JDK8中引入的概念,对应的注解是 @FunctionalInterface 标注在接口上表示这个接口只有一个方法(不算默认方法) 以下
@FunctionalInterface interface Interface1 { int doubleNumber(int i); }
@FunctionalInterface 这个注解只是起到编译时的检查,不加也行 可是推荐要加上
Interface1 interface1 = (i) -> i * 2;
当咱们在标注了@FunctionalInterface这个注解的接口里添加了 2个或者多个方法的时候 会产生编译错误
@FunctionalInterface interface Interface1 { int doubleNumber(int i); void someMethod(); }
当咱们仔细观察 会发现lambda 表达式只是关注的入参和返回值,也就是说能够把这个lambda表达式赋给任何的有一个参数有一个返回值的函数式接口上
Interface1 interface1 = (i) -> i * 2;
这时候就引入了JDK8提供的默认的函数式接口,大多数状况下就不用咱们本身去定义接口了
使用默认的Function函数式接口
Function<Integer , Integer> function = (i) -> i * 2; function.apply(10);
使用默认的Predicate函数式接口
Predicate<Integer> predicate = (i) -> i % 2 == 0; predicate.test(2);
**JKD8接口新特性 默认方法,这个新特性实际上是很重要的,它的做用就是在接口上能够定义方法的实现 做为默认方法,这样
Java就能够扩展不少底层接口 好比List接口 ,对其添加了不少default默认方法,这时候List的接口的实现类也不用去修改了**
前面有介绍关于@FunctionalInterface 会检测该接口有几个待实现的方法,若是有多个则编译不经过,可是
当咱们在另外一个方法上面添加 default
@FunctionalInterface interface Interface1 { int doubleNumber(int i); void someMethod(); }
-》 以下添加default ,此时接口Interface1 仍是保持一个待实现的接口,此时@FunctionalInterface编译就能经过
@FunctionalInterface interface Interface1 { int doubleNumber(int i); default void someMethod(){ System.out.println("Interface1 default Method "); } }
如List提供了 一个sort的default方法,这是之前List接口没有的
本篇主要讲解 lambda表达式的入门,涉及函数式编程和命令式编程的区别,以及jdk8提供的函数式接口 和 接口的默认方法 等等该篇只涉及入门概念,具体深刻理解仍是须要本身去实践,最近准备学习Webflux 因此须要复习一下Java8 lambda 以及 Stream流
我的博客网站 https://www.askajohnny.com 欢迎来访问!
本文由博客一文多发平台 OpenWrite 发布!