前書き
マルチスレッドコードを書くとき、マルチスレッドプログラムを実現するために匿名内部クラスを作成しなければならないことがよくありますが、匿名内部クラスを作成することは目的ではありません。私たちの目的は、匿名内部を実現することではなく、マルチスレッドプログラムを実現することです。クラスなので、このプロセスでの匿名内部クラスの作成は少し冗長です。
ラムダのアイデアと事例
ラムダ式思考
ラムダ式は結果指向であり、これも「上司の基本的な考え方」に沿っています。上司はあなたが何をするかだけを気にしますが、あなたが何をするか、どれだけの努力をするかは気にしません。本質ラムダ式のは「ボス」に関連しています同じ考え方です。
マルチスレッドプログラムを作成するときは、冗長に見えるいくつかのクラスを作成する必要があります。サンプルコードは次のとおりです。
RunnableImplクラスコード:
public class RunnableImpl implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 新线程创建了");
}
}
テストクラス
public class Demo01Runnable {
public static void main(String[] args) {
//创建Runnable接口的实现类对象
RunnableImpl run = new RunnableImpl();
//创建Thread类对象,构造方法中传递Runnable接口的实现类
Thread t = new Thread(run);
//调用start方法开启新线程,执行run方法
t.start();
//简化代码,使用匿名内部类,实现多线程程序
Runnable r = new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 新线程创建了");
}
};
new Thread(r).start();
//简化代码
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 新线程创建了");
}
}).start();
}
}
コード実行の結果
は上記の場合から見ることができます。Runnableマルチスレッドプログラムを作成する過程で、コードの冗長性の問題を解決するために、新しいThreadオブジェクトとRunnableImplオブジェクトを作成する必要があります。Lambda式は先史時代のjdkに乗り込みました。ステージが終了したら、以下ではLambda式がコードの冗長性をどのように解決するかに焦点を当てます。
ラムダ式の使用方法
ケースナンバーワン
この要約では、最初にコードで、マルチスレッドプログラムのラムダ式の実装に焦点を当てています。
public class Demo02Lambda {
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 新线程创建了");
}
}).start();
//使用Lambda表达式,实现多线程
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" 新线程创建了");
}
).start();
//优化省略Lambda
new Thread(()->System.out.println(Thread.currentThread().getName()+" 新线程创建了")).start();
}
}
2つのメソッドの最大の違いは、Lambda式を使用すると、RunnableImplオブジェクトの作成を省略でき、Lambda式はRunnableインターフェイスでrunメソッドを直接呼び出すことができることです。
ケース2
呼び出す必要のあるメソッドにパラメーターがある場合は、ラムダ式も解決できます。ケースについて説明しましょう。ケースの要件は、個人情報を配列に格納してから、年齢で並べ替えることです。コード送信されます。
人のクラス
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
テストクラス
public class DemoTest {
public static void main(String[] args) {
System.out.println("请输入人数: ");
Scanner sc = new Scanner(System.in);
String next = sc.nextLine();
int arraysIndex = Integer.parseInt(next);
Person01[] person01s = new Person01 [arraysIndex];
System.out.println("总共创建了"+person01s.length+"个人的模板");
System.out.println("-------------------------------");
System.out.println("请输入您要输入的人物信息--->"+"格式信息::"+"-> 赵丽颖,31");
//安装
for (int i = 0; i < person01s.length; i++) {
System.out.println("正在输入第"+(i+1)+"个人的信息");
String s = sc.nextLine();
String[] split = s.split(",");
person01s[i] = new Person01();
person01s[i].setName(split[0]);
person01s[i].setAge(Integer.parseInt(split[1]));
}
//采用普通方式
/*Arrays.sort(person01s, new Comparator<Person01>() {
@Override
public int compare(Person01 o1, Person01 o2) {
return o1.getAge()-o2.getAge();
}
});*/
//采用lambda表达式
/*Arrays.sort(person01s,(Person01 o1,Person01 o2)->{
return o1.getAge()-o2.getAge();
});*/
Arrays.sort(person01s,(o1,o2)->o1.getAge()-o2.getAge());
System.out.println("-------------------------");
for (int i = 0; i < person01s.length; i++) {
System.out.println(person01s[i].getName()+"-->"+person01s[i].getAge());
}
}
}
テスト結果
テスト結果は、ラムダを使用するとソートの問題が完全に解決されることを示しています。
ケース3
最初の2つのケースでは、jdk独自のインターフェースは、主にRunnableやComparatorインターフェースなどのラムダ式を実装するために使用されます。ケース3では、Xiao Yuanはカスタムインターフェースを使用して、ラムダ式で関数を直接使用するプロセスを実装します。
この場合、簡単な加算計算プロセスを実装します
追加インターフェース
public interface Multiplication {
public abstract Double mul(Double a, Double b);
}
テストクラス
public class Demo02Mul {
public static void main(String[] args) {
System.out.println("请输入两个相乘的数:");
System.out.println("请输入第一个数;");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
double a = Double.parseDouble(s);
System.out.println("请输入第二个数;");
s=sc.nextLine();
double b = Double.parseDouble(s);
System.out.println("计算结果是:");
/*muli(a, b, new Multiplication() {
@Override
public Double mul(Double a, Double b) {
return a*b;
}
});*/
/*muli(a,b,(Double aa, Double bb)->{
return aa*bb;
});*/
muli(a,b,(aa,bb) -> aa*bb);
}
private static void muli(Double a,Double b,Multiplication m){
Double mul = m.mul(a,b);
System.out.println(mul);
}
}
総括する
上記の3つのケースから、ラムダ式を使用するために必要な前提条件を要約できます
。1。十分なインターフェイスがあります。インターフェイスには抽象メソッドが1つだけあります(抽象メソッドの一意性)。抽象メソッドが多すぎるとラムダが失敗します。対応を解決します。関数。
2. Lambdaの使用にはコンテキスト推論が必要です(メソッドのパラメーターはラムダに対応している必要があります)。
同様に、ラムダ式の簡略化ルールも知ることができ
ます。1。括弧内のパラメーターのタイプは省略できます
。2。中括弧内にステートメントが1つしかない場合は、戻り値、大きな括弧、returnキーワード、およびステートメントのセミコロン。