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;
}
}