Java8开始支持函数式编程、包括lambda表达式、Stream流。java
函数式编程用于简化开发,对于某些类,或许只使用一次,那么就不必对其进行单独的实现一个类,java本来提供了简化的方案,如内部类、匿名内部类等。编程
lambda对此更加简化。app
函数式接口就是只有一个方法的接口,想一想函数是否是一个个是独立的。jvm
Runnable接口就是一个函数式接口,以下:函数式编程
@FunctionalInterface public interface Runnable { public abstract void run(); } //@FunctionalInterface注解表明这是一个函数式接口,但不是必须的,加上注解jvm会帮助检查。 // public abstract void run();中的abstract也能够省略,接口中的方法本就是抽象方法
使用了函数式接口后,就不须要实现类,直接使用lambda便可。函数
lambda用于替代实现类,形式以下:spa
FunctionalInterface func=()->{ ...... };
@FunctionalInterface interface Func{ void hello(); }
public class LambdaDemo { public static void main(String[] args) { Func func=()->{ System.out.println("hello");//lambda表达式 }; func.hello();//调用方法 } }
直接在抽象方法前加上返回类型,在lambda中有返回值便可。code
public class LambdaDemo { public static void main(String[] args) { Func func=()->{ System.out.println("hello"); return "ok lambda"; }; String s = func.hello(); System.out.println(s); } } @FunctionalInterface interface Func{ String hello(); }
参数声明在抽象方法中,在lambda中加上类型便可:接口
public class LambdaDemo { public static void main(String[] args) { Func func=(int a,String c)->{ System.out.println("hello"+a+c); return "ok lambda"; }; String s = func.hello(8,"yes"); System.out.println(s); } }
lambda中的数据类型能够略去开发
Func func=( a,c)->{ System.out.println("hello"+a+c); return "ok lambda"; };
若是只有一个参数的话,连()均可以省略。
public class LambdaDemo { public static void main(String[] args) { Func func=c->{ //lambda省去() System.out.println("hello "+c); return "ok lambda"; }; String s = func.hello("yes"); System.out.println(s); } } @FunctionalInterface interface Func{ String hello(String b); }
JDK 1.8为咱们预约义了许多函数式接口,它们位于java.util.function包中。
经常使用的以下:
序号 | 接口名 | 抽象方法 | 说明 |
---|---|---|---|
1 | Supplier<T> | Tget() | 无输入参数,经过一系列操做产生一个结果返回 |
2 | Consumer<T> | voidaccept(Tt) | 一个输入参数,针对参数作一系列操做,无返回值 |
3 | Function<T,R> | Rapply(Tt) | 一个参数,一个返回值,针对参数生成一个返回值 |