面向对象思想:   找能解决问题的对象 ,调用对象的方法

函数式编程思想:只要能获取到结果,强调做什么,而不是以什么形式去做

实现Runnable代码:

public class Demo {
    public static void main(String[] args) {
    Runnable r=new Runnable() {
        @Override
        public void run() {
            System.out.println("111");
        }
    };
    Thread t=new Thread(r);
    t.start();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

简化:省去了类名称,额外定义接口的实现

new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("111");
        }
    }).start();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

编程思想转换:

传递一段代码,才是我们真正的目的,创建对象只是受限于面向对象语法而不得不采取的一种手段和方法。如果我们将关注点从“怎么做”回归到“做什么”的本质上,过程与形式其实并不重要

lambda表达式的引入:

     

【java笔记】lambda表达式介绍和使用_java

 

使用lambda表达式的重点就是延迟执行。(只在必要的情况才运行代码)

Lambda标准格式:

(参数类型 参数名称)->{代码语句}
  • 1.

():接口中抽象方法的参数列表,没有参数为空;有参数就写多个参数,用逗号分隔

   -> :传递,把参数传递给方法体{}

   {}:重写接口的抽象方法的方法体

例:lambda实现cook接口
public interface Cook {
    void cook();
}
public class Demo {
    public static void main(String[] args) {
      invokeCook(()->{
          System.out.println("做饭");
      });
    }
    public static void invokeCook(Cook c){
        c.cook();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

如果方法的参数是一个函数式接口,那么可以使用lambda表达式化简 

例:person类对age升序排序
Person[] arr={new Person(4,"a"),new Person(3,"b")};
Arrays.sort(arr,(p1,p2)->p1.getAge()-p2.getAge());
for(Person p:arr){
     System.out.println(p);
 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

例:计算器Calculator接口,内涵calc可以将两个int数字相加得到和值

public interface Calcu {
    int cal(int a,int b);
} 
public static void main(String[] args) {
        invokeCalc(10,30,(int a,int b)->{return a+b;});
    }
    private static void invokeCalc(int a,int b,Calcu ca){
        System.out.println(ca.cal(a,b));
        return;
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

lambda省略格式

可推导,可省略:凡是根据根据上下文推导出来的内容,都可以省略书写

参数类型:括号中参数列表的数据类型,可以省略不写

参数列表:括号中的参数如果只有一个,那么类型和()都可以省略

return:如果代码只有一行,那么{}和return;都可以不写

 上例调用calula接口可以写为

invokeCalc(10,30,(int a,int b)->a+b);
  • 1.

对person按年龄排序可写为:

Arrays.sort(arr,(Person p1,Person p2)->p1.getAge()-p2.getAge());
  • 1.

字符串按长度升序排序

【java笔记】lambda表达式介绍和使用_函数式接口_02

 泛型后面可以不写(可推导)

ArrayList<String>list=new ArrayList<>();
  • 1.

 Lambda使用前提

1、lambda必须有接口,且要求接口中有且仅有一个方法

有且只有一个抽象方法的接口,称为“函数式接口

2、必须有上下文推断

函数式接口:

【java笔记】函数式接口_暮色_年华的博客

lambda与函数式接口结合:

lambda与runnable接口:打印10次hello

【java笔记】lambda表达式介绍和使用_java_03

 lambda与consumer结合:指出已经迭代的次数

【java笔记】lambda表达式介绍和使用_System_04

 

【java笔记】lambda表达式介绍和使用_开发语言_05

【java笔记】lambda表达式介绍和使用_函数式接口_06