1.什么是函数式(Funtional)接口

  • 只包含一个抽象方法的接口, 称为函数式接口.
  • 可以通过Lambda表达式来创建该接口的对象.若Lambda表达式抛出一个受检异常(即:非运行异常),那么该异常需要在目标接口的抽象方法上进行声明.
  • 可以在一个接口上使用@Functionallnterface注解,这样做可以检查它是否是一个函数式接口.同时javadoc也会包含一条声明,说明这个接口是一个函数式接口
  • 在Java.util.function包下定义了Java 8的丰富的函数式接口

2.Javan内置的函数式接口

image.png
image.png

写法示例:

  1. /**
  2. * java内置的4大核心函数式接口
  3. * 消费型接口 Consumer<T> void accept(T t)
  4. * 供给型接口 Supplier<T> T get()
  5. * 函数型按口 Function<T,R> R apply(T,t)
  6. * 断定型接口 Predicate<T> booLean test(T,t)
  7. */
  8. public class LambdaTest2 {
  9. public void test1(){
  10. //传统方式
  11. happyTime(500, new Consumer<Double>()){
  12. @Override
  13. public void accept(Double aDouble){
  14. System.out.println("学习太累了, 去泡个澡, 价格为: "+ aDouble);
  15. }
  16. }
  17. //------------------------
  18. // Lambda方式
  19. happyTime(400, money -> System.out.println("学习太累了, 去泡个澡, 价格为: "+ money));
  20. }
  21. public void happyTime(double money, Consumer<Double> con){
  22. con.accept(money);
  23. }
  24. public void test2(){
  25. List<String> list = Arrays.asList("北京","南京","天津","东京","戏精");
  26. //传统方式
  27. List<String> filterStrs = filterString(list, new Predicate<String>() {
  28. @Override
  29. public boolean test(String s){
  30. return s.contains("京");
  31. }
  32. });
  33. System.out.println(filterStrs);
  34. //------------------------
  35. // Lambda方式
  36. List<String> filterStrs2 = filterString(list,s -> s.contains("京"));
  37. System.out.println(filterStrs2);
  38. }
  39. public List<String> filterString(List<String> list, Predicate<String> pre){
  40. ArrayList<String> filterList = new ArrayList<>();
  41. for (String s: list) {
  42. if (pre.test(s)){
  43. filterList.add(s);
  44. }
  45. }
  46. return filterList;
  47. }
  48. public static void main(String[] args) {
  49. LambdaTest2 lt2 = new LambdaTest2();
  50. lt2.test2();
  51. }
  52. }