package com.xx;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* @author xx
* DateTime: 2019/11/14 16:42
* Description: Java8內置四大核心函數式接口
* Consumer<T>:消費型接口
* void accept<T t>
* Suppier<T>:供給型接口
* T get()
* Function<T, R>:函數型接口
* R apply(T t)
* Predicate<T>:斷言型接口
* boolean test(T t)
*
* 簡單介紹下:Lambad表達式,用於簡化代碼,並不會對代碼的執行原理產生影響
* Lambad的格式:(參數,可以是有參也可以是無參) -> {方法體,一些對參數進行操作的代碼}
* ::操作符可以更加簡化代碼,替代箭頭符這種形式
* 對象::實例方法
* 類::靜態方法
* 類::實例方法
* eg:
* (x) -> System.out.println(x);
* System.out::println;
*/
public class LambdaTest1 {
/**
* Predicate<T>:斷言型接口
*/
@Test
public void test3() {
List<String> list = Arrays.asList("aaaa", "bbb", "cccc", "ddd", "eeee");
List<String> strings = filterStr(list, (s) -> s.length() > 3);
System.out.println(strings);
}
/**
* 將滿足條件的字符串放入集合中
*/
public List<String> filterStr(List<String> list, Predicate<String> pre) {
ArrayList<String> strList = new ArrayList<>();
for (String str : list) {
if(pre.test(str)){
strList.add(str);
}
}
return strList;
}
/**
* Function<Tm R>函數型接口
*/
@Test
public void test2 () {
String s = strHandler("ahfja45646 dsfsdfjo5465fsd4f", (str) -> str.toUpperCase());
// 也可以使用::這種方式來寫
// String s = strHandler("ahfja45646 dsfsdfjo5465fsd4f", String::toUpperCase);
System.out.println(s);
}
/**
* 字符串處理
*/
public String strHandler (String str, Function<String, String> fun) {
return fun.apply(str);
}
/**
* Supplier<T>供給型接口
*/
@Test
public void test1 () {
List<Integer> numberList = getNumberList(10, () -> new Random().nextInt(100));
numberList.forEach(System.out::println);
System.out.println(numberList);
}
/**
* 產生一些整數,並放入集合中
*/
public List<Integer> getNumberList(int num, Supplier<Integer> sup) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer n = sup.get();
list.add(n);
}
return list;
}
/**
* Consumer<T>消費型接口
*/
@Test
public void test() {
happy(10000, (m) -> System.out.println("喫飯花費:" + m + "元"));
}
public void happy(double money, Consumer<Double> consumer){
consumer.accept(money);
}
}