Java-Lambda運算式
- 一、面向物件編程及函式式編程
- 二、Lambda運算式
- 三、代碼實作
一、面向物件編程及函式式編程
面向物件編程:對于每一個任務,需要找到能夠解決此任務的物件,呼叫其中的方法解決問題,強調的是物件,
函式式編程:對于每一個任務,強調的是任務解決的結果,不關心解決任務的程序,強調的是結果,
二、Lambda運算式
Lambda運算式:JDK1.8出現的新特性,簡化代碼的書寫.
Lambda的標準格式:
?(引數型別 引數名稱)->{代碼陳述句}
?():介面中抽象方法的引數串列,沒有引數,就寫成空;多個引數使用逗號分隔
?->:傳遞的意思,把引數傳遞給方法體
?{}:重寫抽象方法的方法體
Lambda運算式省略規則:
?1.小括號里的引數型別可以省略,
?2.如果小括號中()僅有一個引數,小括號也可以省略,
?3.如果大括號{}內僅有一個引數,則無論是否有回傳值,都可以省略大括號,return關鍵字即陳述句分號(要省略一塊省略,單獨省略會報錯),
Lambda使用前提:
?1.必須具有介面,且要求介面中有且僅有一個抽象方法,即保證抽象方法唯一,
?2.使用Lambda必須具有背景關系推斷,就是方法的引數或區域變數型別必須為Lambda對應的介面型別,才能使用Lambda作為該介面的實體,
三、代碼實作
public class LambdaDemo01 {
public static void main(String[] args) {
//創建Runnable介面的實作類物件
RunnableDemo demo = new RunnableDemo();
//創建執行緒類物件,并將demo作為引數進行傳遞
Thread t = new Thread(demo);
t.start();//輸出結果:Thread-0創建執行緒
//使用Runnable實作類,發現有很多代碼是冗余的
//使用匿名內部類簡化代碼書寫
Runnable run = new Runnable(){
public void run() {
System.out.println(Thread.currentThread().getName()+"創建執行緒");
};
};
new Thread(run).start();輸出結果:Thread-1創建執行緒
//進一步簡化代碼
new Thread( new Runnable(){
public void run() {
System.out.println(Thread.currentThread().getName()+"創建執行緒");
};
}).start();//輸出結果:Thread-2創建執行緒
//發現使用匿名內部類的代碼雖然簡化書寫但是復雜度較高,不易理解,其實不難發現我們要的
//只是run方法中的執行代碼,使用Lambda運算式即可很好解決這種問題
//1.Lambda運算式無參無回傳值
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"創建執行緒");
}).start();//輸出結果:Thread-3創建執行緒
//優化寫法,省略大括號和分號,必須同時省略
new Thread(()->System.out.println(Thread.currentThread().getName()+"創建執行緒")).start();
//2.Lambda運算式有引數,無回傳值,做一個按年齡排序的案例
Person[] pArray = {new Person("孫悟空",18),
new Person("豬八戒",20),
new Person("沙僧",21)};
// Arrays.sort(pArray,new Comparator<Person>(){
//
// @Override
// public int compare(Person arg0, Person arg1) {
// // TODO Auto-generated method stub
// return arg0.getAge()-arg1.getAge();
// }
//
// });
//使用Lambda運算式
Arrays.sort(pArray,(Person p1,Person p2)->{
return p1.getAge()-p2.getAge();
});
//優化代碼,省略引數資料型別,大括號,return
Arrays.sort(pArray,(p1,p2)-> p1.getAge()-p2.getAge());
//遍歷陣列
for(Person p:pArray){
System.out.println(p);/*
Person [name=孫悟空, age=18]
Person [name=豬八戒, age=20]
Person [name=沙僧, age=21]
*/
}
//3.Lambda運算式有引數,有回傳值,做一個加減法
//先使用匿名內部類
// addDemo add = new addDemo(){
//
// @Override
// public int add(int a, int b) {
// // TODO Auto-generated method stub
// return a+b;
// }
// };
// System.out.println(add.add(3, 4));//輸出結果:7
//使用Lambda運算式有引數有回傳值
int result=result(3,5,(int a,int b)->{
return a+b;
});
System.out.println(result);//輸出結果:8
}
public static int result(int a,int b,addDemo add){
int result=add.add(a, b);
return result;
}
}
//創建Runnable介面的實作類,重寫run方法,設定執行緒任務
class RunnableDemo implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"創建執行緒");
}
}
class Person{
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
//創建一個介面,定義兩個數相加
interface addDemo{
public abstract int add(int a,int b);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257087.html
標籤:java
下一篇:java執行緒阻塞問題排查
