达内javaSE_day08 学习笔记 —— lambda表达式

javaSE_day08

目录

  • javaSE_day08
  • lambda表达式
    • lambda表达式使用已定义方法
    • Lambda对构造方法的引用

lambda表达式

把方法通过匿名类实现的方式简化成一个表达式(lambda表达式)的写法。

  • 函数式接口
    接口中只有一个抽象方法
    检查函数式接口的注解:@FunctionalInterface

  • 语法格式
    () -> {}
    () 表示形参列表
    -> 符号 goes to
    {} 表示方法体
    达内javaSE_day08 学习笔记 —— lambda表达式_第1张图片
    达内javaSE_day08 学习笔记 —— lambda表达式_第2张图片

  • 如果只有一条语句,{ }可省略
    eg:
    /* IA a2 = ()-> {
    System.out.println(“hello!!!”);
    };*/
    IA a2 = ()-> System.out.println(“hello!!!”);

  • 参数列表的数据类型可省略
    eg:
    /* IA2 a2 = (int x,int y)->{ //lambda表达式
    System.out.println(x+y);
    };*/
    IA2 a2 = ( x, y)-> System.out.println(x+y);

  • 如果参数列表是一个参数,()可以省略
    //IA2 a2 = x-> System.out.println(x+y);

  • 如果方法体中只有一条语句,return可以省略
    eg:
    /* IA3 a = (int x,int y)->{ //lambda表达式
    return x+y;
    };*/
    IA3 a = (x,y)->x+y;

练习:

  1. 给定一个厨师接口Cook,内含唯一的抽象方法makeFood,且无参数, 无返回值。
    使用Lambda的标准格式调用invokeCook方法,打印"吃饭啦!"
package cn.tedu.lambda;

interface Cook{
	//输出 吃饭啦
	void makeFood();
}
public class TestLambda {
	public static void invokeCook(Cook cook) {
		cook.makeFood();
	}

	public static void main(String[] args) {
		
		invokeCook(new Cook() { //匿名类			
			@Override
			public void makeFood() {
				System.out.println("吃饭啦!");
				
			}
		});

		invokeCook(()->System.out.println("吃饭啦!!")); //lambda表达式
		
	}
}

2.定义接口
public interface Calculator {
//定义一个计算两个int整数和的方法并返回结果
int calc(int a,int b);
定义测试类
public class Demo01Calculator {
public static void main(String[] args) {
//调用invokeCalc方法,方法的参数使用匿名内部类
实现
//使用Lambda表达式简化匿名内部类的书写
}
public static void invokeCalc(int a,int b,Calculator c){
int sum = c.calc(a,b);
System.out.println(sum);
}
}

package cn.tedu.lambda;

interface Calculator{
	int calc(int a,int b);
}
public class TestCalculator {

	public static void invokeCalc(int a,int b,Calculator c) {
		int sum = c.calc(a, b);
		System.out.println(sum);
	}
	public static void main(String[] args) {
		invokeCalc(1, 2, new Calculator() {  //匿名内部类实现接口
			
			@Override
			public int calc(int a, int b) {
				return a+b;
			}
		});
		
		invokeCalc(2, 3,(a,b)->a+b);  //lambda表达式

	}

}

lambda表达式使用已定义方法

方法和接口的参数相同,返回类型相同时才可用这种格式:
方法的归属者 : : 方法名

  • 非静态方法:方法的归属者就是对象名;
  • 静态方法:方法的归属者是类名
    达内javaSE_day08 学习笔记 —— lambda表达式_第3张图片
    练习:
package cn.tedu.lambda;
/**
 * 练习
 * @author Dell
 *
 */
interface IDemo{
	//控制输出
	void showMessage(String msg);
}
interface IDemo2{
	//返回两个数的最大值:Math.max()
	int max(int x,int y);
}
public class Demo5 {

	/*public void showMessage(String msg) {
		System.out.println(msg);
	}
	public static int max(int x,int y) {
		return Math.max(x, y);
	}*/
	public static void main(String[] args) {
		Demo5 demo = new Demo5();
		
		/*IDemo demo1 = demo:: showMessage;
		demo1.showMessage("123");
		
		IDemo2 demo2 = Demo5::max;
		System.out.println(demo2.max(1, 2));*/
		
		IDemo demo1 = System.out:: println;
		demo1.showMessage("123");
		
		IDemo2 demo2 = Math::max;
		System.out.println(demo2.max(1, 2));
	}

}

Lambda对构造方法的引用

格式:
类名 : : new
达内javaSE_day08 学习笔记 —— lambda表达式_第4张图片

你可能感兴趣的:(javaSE实训笔记)