直接上代码,解释在注释里:
// 目标:熟悉内部类、匿名内部类、Lambda 表达式、 方法引用的用法 与 关系
// 实例目的: 使用 Creator 生产 ProductionA (不在乎具体的生成商,只要产品就行)
package com.example.javalearnproject.lambda;
import org.junit.Test;
public class LambdaTest {
// 目标:熟悉内部类、匿名内部类、Lambda 表达式、 方法引用的用法 与 关系
// 实例目的: 使用 Creator 生产 ProductionA (不在乎具体的生成商,只要产品就行)
@Test
public void test() {
//{1.Creator 完整内部类
RealCreatorA realCreatorA = new RealCreatorA();
Production production1 = realCreatorA.create("特斯拉", "内部类实现创建", 1);
System.out.println(production1);
//1.Creator完整的内部类}
//{2.Creator 内部匿名类 - 省去具体实现的接口名
Production production2 = new Creator() {
@Override
public Production create(String name, String description, int version) {
return new RealProductionA(name, description,version);
}
}.create("特斯拉", "内部匿名类实现创建", 1);
System.out.println(production2);
//2.Creator 内部匿名类}
//{3 Creator 内部匿名类:使用Lambda 表达式简化 - 省去接口名和实现的方法名
Production production3 = ((Creator) (name, description, version) -> new RealProductionA(name, description, version))
.create("特斯拉", "内部匿名类:使用Lambda 表达式简化", 1);
System.out.println(production3);
//3 Creator 内部匿名类:使用Lambda 表达式简化}
//{4 Creator 内部匿名类:使用 方法引用(双冒号::) 表达式简化 - 省去形参
Production production4 = ((Creator) RealProductionA::new)
.create("特斯拉", "内部匿名类:使用 方法引用(双冒号::) 表达式简化", 1);
System.out.println(production4);
//4 Creator 内部匿名类:使用 方法引用(双冒号::) 表达式简化}
}
//{Common codes ****************************************************************************
//{创建产品的接口
interface Creator {
Production create(String name, String description, int version);
}
//创建产品的接口}
//{抽象产品
abstract class Production {
private String mName;
private String mDescription;
private int mVersion;
public Production(String name, String description, int version) {
this.mName = name;
this.mDescription = description;
this.mVersion = version;
}
@Override
public String toString() {
return "Production{" +
"mName='" + mName + '\'' +
", mDescription='" + mDescription + '\'' +
", mVersion=" + mVersion +
'}';
}
}
//抽象产品}
//{具体产品A
class RealProductionA extends Production {
public RealProductionA(String name, String description, int version) {
super(name, description, version);
}
}
//具体产品A}
//Common codes ****************************************************************************}
//{具体生产者A:内部类实现
private class RealCreatorA implements Creator {
@Override
public Production create(String name, String description, int version) {
return new RealProductionA(name, description, version);
}
}
//具体生产者A:内部类实现}
}