1. 程式人生 > >JDK8 lambda表示式 及四大內建核心函式式介面

JDK8 lambda表示式 及四大內建核心函式式介面

package com.hundsun.java.se.java8;

 

import org.junit.Test;

 

import java.util.Comparator;

import java.util.function.Consumer;

 

/**

* @Description: lambda表示式的基礎語法

* @author:zhangys

* @date:Created in 16:33 2018/12/30

* @Modified By:

*/

public class DemoLamda {

/**

* 箭頭操作符 的左側對應介面方法中的引數,有幾個就寫幾個

* 箭頭操作符 的右側對應介面方法中的函式體

*/

 

/**

* 語法格式一: 無引數 無返回值

* () -> System.out.println("hello word")

*/

@Test

public void test1(){

 

int num = 0; //jdk1.7之前,必須是final

Runnable r = new Runnable() {

@Override

public void run() {

System.out.println("hello");

}

};

r.run();

System.out.println("--------------");

 

Runnable r1 = () -> System.out.println("hello" + num);

r1.run();

}

 

/**

* 語法格式二:有一個引數,並且無返回值

*/

 

@Test

public void Test2(){

Consumer<String> con = (x) -> System.out.println(x);

con.accept("lambda語法格式");

}

 

/**

* 語法格式三:如果只有一個引數,小括號可以不寫

*/

@Test

public void Test3(){

Consumer<String> con = x -> System.out.println(x);

con.accept("lambda語法格式");

}

 

/**

* 語法格式四 : 有兩個以上的引數,並且lambda體中有多條語句,並且有返回值

*/

 

@Test

public void test4(){

Comparator<Integer> com = (x,y) -> {

System.out.println("函式式介面");

return Integer.compare(x,y);

};

}

 

/**

* 語法格式五:如果有兩個引數,如果lambda體中只有一條語句,return和{} 都可以不寫

*/

 

public void test5(){

Comparator<Integer> com = (x,y) -> Integer.compare(x,y);

}

 

/**

* lambda的資料型別可以不寫,因為jvm的編譯器可以通過上下文推斷出資料型別,即“型別推斷”

* 即 String[] str = {"123","333","444"};

*

* String[] str;

* str = {"111","222","333"}

*/

public void test6(){

Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);

}

 

/**

* 總結:左右遇一 括號省

* 左側推斷型別省 (資料型別省略)

* 能省則省

*/

 

/**

* 二、lambda表示式需要“函式式介面”的支援

* 函式式介面:如果介面中只有一個抽象方法,稱為函式式介面,可以使用一個註解 @FunctionalInterface,可以檢查介面是否是函式式介面

*/

 

}

 

 

 

 

四大內建核心函式式介面

 

package com.hundsun.java.se.java8;

 

import org.junit.Test;

import org.omg.PortableInterceptor.INACTIVE;

 

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

import java.util.function.Predicate;

import java.util.function.Supplier;

 

/**

* @Description: 四大內建核心函式式介面

* @author:zhangys

* @date:Created in 19:05 2018/12/30

* @Modified By:

*/

public class DemoLambdaHanshu {

 

List<Employee> employees = Arrays.asList(

new Employee("zhangsan",19,9999.99),

new Employee("lisi",38,5555.55),

new Employee("wangwu",50,6666.66),

new Employee("zhaoliu",16,3333.33),

new Employee("tianqi",18,7777.77)

);

 

@Test

public void test(){

Collections.sort(employees,(e1,e2) -> {

if (e1.getAge() == e2.getAge()) {

return e1.getName().compareTo(e2.getName());

} else {

return Integer.compare(e1.getAge(),e2.getAge());

}

});

 

for (Employee e : employees){

System.out.println(e);

}

}

 

 

/**

* 四大核心函式式介面

* 1、consumer<T> 消費型介面

* void accept(T t)

* 2、Supplier<T> 供給型介面

* T get()

* 3、Function<T,R> 函式型介面

* R apply(T t)

* 4、Predicate<T> 斷言型介面

* boolean test(T t)

*/

 

/**

* consumer

*/

@Test

public void test1(){

happy(10000,(m) -> System.out.println("消費" + m + "元"));

}

 

public void happy(double money, Consumer<Double> con){

con.accept(money);

}

 

/**

* supplier

*/

@Test

public void test2(){

List<Integer> list = getNumList(10,() -> (int)(Math.random() * 100));

for (Integer each : list){

System.out.println(each);

}

}

//產生一些整數,放入集合中

public List<Integer> getNumList(int num, Supplier<Integer> sup){

List<Integer> list = new ArrayList<>();

for (int i = 0; i < num; i++){

Integer n = sup.get();

list.add(n);

}

return list;

}

 

 

/**

* Function

* @param str

* @param fun

* @return

*/

@Test

public void test3(){

String newStr = strHandler(" handler ",(str) -> str.trim());

System.out.println(newStr);

 

String subStr = strHandler("hhhhhhh",(str) -> str.substring(0,5));

System.out.println(subStr);

 

}

 

public String strHandler(String str, Function<String,String> fun){

return fun.apply(str);

}

 

/**

* Predicate

*/

 

@Test

public void test4(){

List<String> lsit = Arrays.asList("1111","222","44444","6666","asdfasd");

List<String> list = filterStr(lsit,(s) -> s.length() > 3);

for (String e : list){

System.out.println(e);

}

}

public List<String> filterStr(List<String> list, Predicate<String> pre){

List<String> strList = new ArrayList<>();

for (String str : list){

if(pre.test(str)){

strList.add(str);

}

}

return strList;

}

}