轉(zhuǎn)自:https://www.cnblogs.com/hyyq/p/7425666.html
基礎(chǔ)介紹
Lamda表達(dá)式者春,讀作λ表達(dá)式,它實(shí)質(zhì)屬于函數(shù)式編程的概念塔嬉,要理解函數(shù)式編程的產(chǎn)生目的,就要先理解匿名內(nèi)部類租悄。
場景:在使用時(shí)谨究,再實(shí)現(xiàn)具體的業(yè)務(wù)邏輯;
先來看看傳統(tǒng)的匿名內(nèi)部類調(diào)用方式:
interface MyInterface{
void lMethod();
}
public class Main {
public static void test(MyInterface myInterface){
myInterface.lMethod();
}
public static void main(String[] args) {
test(new MyInterface() {
@Override
public void lMethod() {
System.out.println("Hello World!");
}
});
}
}
在主類中的這么幾行代碼泣棋,嵌套幾層就為了輸出一個(gè)Hello World胶哲!是不是很麻煩?但是由于java結(jié)構(gòu)的完整性潭辈,我們還不得不那么做鸯屿,現(xiàn)在JDK1.8來了澈吨。
再來看看使用Lamda表達(dá)式改寫上面的代碼:
interface MyInterface{
void lMethod();
}
public class Main {
public static void test(MyInterface myInterface){
myInterface.lMethod();
}
public static void main(String[] args) {
test(()->System.out.println("Hello World!"));
}
}
這就是Lamda表達(dá)式語言,為了解決匿名內(nèi)部類繁雜的操作而出現(xiàn)寄摆。
Lamda語法有三種形式:
(參數(shù)) ->單行語句谅辣;
(參數(shù)) ->{多行語句};
(參數(shù)) ->表達(dá)式冰肴;
括號()可以大致理解為就是方法屈藐,里面是參數(shù)變量,在上面的例子中()->System.out.println("Hello World!") 前面的()代表void lMethod()方法熙尉,它沒有入?yún)⒘撸詾榭眨?>后面是一個(gè)單行語句;
如果->后面是多行語句检痰,需要用{ }裝起來包归,每條語句后需要有分號;
->后面也可以是一個(gè)表達(dá)式,如:a+b等铅歼。
(參數(shù)) ->單行語句:
interface MyInterface{
void lMethod(String str);
}
public class Main {
public static void test(MyInterface myInterface){
myInterface.lMethod("Hello World!");//設(shè)置參數(shù)內(nèi)容
}
public static void main(String[] args) {
//首先在()中定義此表達(dá)式里面需要接收變量s公壤,后面的單行語句中就可以使用該變量了
test((s)->System.out.println(s));
}
}
(參數(shù)) ->{多行語句}:
interface MyInterface{
void lMethod(String str);
}
public class Main {
public static void test(MyInterface myInterface){
myInterface.lMethod("Hello World!");//設(shè)置參數(shù)內(nèi)容
}
public static void main(String[] args) {
//首先在()中定義此表達(dá)式里面需要接收變量s,后面的多行語句中就可以使用該變量了椎椰。注意:多行語句別少“厦幅;”號
test((s)->{
s=s+s;
System.out.println(s);
});
}
}
(參數(shù)) ->表達(dá)式:
interface MyInterface{
int lMethod(int a,int b);
}
public class Main {
public static void test(MyInterface myInterface){
int result=myInterface.lMethod(1,2);//設(shè)置參數(shù)內(nèi)容,接收返回參數(shù)
System.out.println(result);
}
public static void main(String[] args) {
test((x,y)-> x*y );//調(diào)用方法
//相當(dāng)于
// test((x,y)-> {return x*y;});
}
}
這樣,Lamda表達(dá)式就看起來很簡單了慨飘,有不有确憨!
匿名內(nèi)部類,我們比較常用的地方在哪兒瓤的?線程類Thread休弃,以前我們可能這樣寫:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程操作!");
}
});
現(xiàn)在圈膏,使用Lamda表達(dá)式塔猾,簡單寫為:
new Thread(()->System.out.println("線程操作!"));
總結(jié):利用Lamda表達(dá)式是為了避免匿名內(nèi)部類定義過多無用的操作稽坤。
進(jìn)階
建立簡單Bean類丈甸,方面后面的測試
import java.util.ArrayList;
import java.util.List;
public class Human {
private String name;
private int age;
public Human() {
}
public Human(String name, int age) {
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;
}
@SuppressWarnings("serial")
public static List<Human> getAInitHumanList() {
return new ArrayList<Human>() {
{
add(new Human("guorao", 10));
add(new Human("mako", 12));
add(new Human("hel", 30));
add(new Human("lin", 28));
}
};
}
}
簡單的排序方法
1、利用實(shí)現(xiàn)Comparator接口方式
public class HumanComparetor implements Comparator<Human> {
@Override
public int compare(Human h1, Human h2) {
if (h1.getAge() > h2.getAge()) {
return 1;
} else if (h1.getAge() == h2.getAge()) {
return 0;
} else {
return -1;
}
}
}
public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
Collections.sort(humans, new HumanComparetor());
System.out.println(humans);
}
2尿褪、利用內(nèi)部類
public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//方法內(nèi)-局部類
class HumanComparetor implements Comparator<Human> {
@Override
public int compare(Human h1, Human h2) {
return h1.getAge() - h2.getAge();
}
}
Collections.sort(humans, new HumanComparetor());
System.out.println(humans);
}
利用新特性
1睦擂、利用lamdba方式
public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//lamdba 表達(dá)式 ->
Collections.sort(humans, (Human h1, Human h2) -> h1.getAge() - h2.getAge());
System.out.println(humans);
}
2、利用Comparator和lamdba表達(dá)式多條件排序
public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
////lamdba 表達(dá)式 ::
Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName));
System.out.println(humans);
}
3茫多、用Comparator接口方式多條件排序
public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//直接用list.sort
humans.sort(Comparator.comparing(Human::getAge).thenComparing(Human::getName));
System.out.println(humans);
}
解釋:Comparable和Comparator
- 1祈匙、Comparable為內(nèi)部比較類忽刽,是實(shí)現(xiàn)的對象自身與其他對象進(jìn)行比較
object.compareTo(object2)
- 2天揖、Comparator為外部比較類夺欲,是實(shí)現(xiàn)某種對象之間的屬性、值之間的比較方式今膊;
其實(shí)Comparator就是一種典型的策略模式些阅;
ComparatorImpl comparator = new ComparatorImpl();
comparator.compare(object1, object2)