什么是函數(shù)式接口
- 只包含一個抽象方法的接口,稱為函數(shù)式接口匾南。
- 你可以通過 Lambda 表達式來創(chuàng)建該接口的對象。(若 Lambda 表達式拋出一個受檢異常,那么該異常需要在目標接口的抽象方法上進行聲明)叽粹。
- 我們可以在任意函數(shù)式接口上使用 @FunctionalInterface
注解, 這樣做可以檢查它是否是一個函數(shù)式接口,同時 javadoc 也會包 含一條聲明虫几,說明這個接口是一個函數(shù)式接口锤灿。
自定義函數(shù)式接口
image.png
代碼
package com.www.java8.inter;
/**
* 函數(shù)式接口
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時間: 2022/8/11 18:27 星期四
* <p>
*/
@FunctionalInterface
public interface MyFun<T> {
/**
* 獲取傳入的參數(shù)
*
* @param t
* @return
*/
public Integer getValue(Integer t);
}
作為參數(shù)傳遞Lambda 表達式
image.png
作為參數(shù)傳遞 Lambda 表達式:為了將 Lambda 表達式作為參數(shù)傳遞,接 收Lambda 表達式的參數(shù)類型必須是與該 Lambda 表達式兼容的函數(shù)式接口 的類型辆脸。
Java 內(nèi)置四大核心函數(shù)式接口
image.png
其他接口
image.png
代碼演示
package com.www.java8.test;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* Java8 內(nèi)置的四大核心函數(shù)式接口
* <p>
* Consumer<T> :消費型接口
* void accept(T t);
* <p>
* Supplier<T> :供給型接口
* T get();
* <p>
* Function<T, R> :函數(shù)型接口
* R apply(T t);
* <p>
* Predicate<T> : 斷言型接口
* <p>
* boolean test(T t);
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時間: 2022/8/11 19:39 星期四
* <p>
*/
public class Lambda2Test {
/**
* Consumer<T> 消費型接口 但校, 有去無回
*/
@Test
public void testConsumer() {
happy(46919, m -> System.out.println("享受生活消費 " + m + "元"));
}
/**
* Supplier<T> 供給型 接口
*/
@Test
public void testSupplier() {
List<Integer> numbers = getNumbers(10, () -> (int) (Math.random() * 100));
numbers.forEach(System.out::println);
}
/**
* Function<T> 函數(shù)型接口
*/
@Test
public void testFunction() {
String wfsdgfasdf = strHandle("\t\t\t\t\twfsdgfasdf ", String::trim);
System.out.println(wfsdgfasdf);
String str = strHandle("\t\t\t\t\twfsdgfasdf 我愛中國sdf", s -> s.substring(s.length() - 7, s.length() - 3));
System.out.println(str);
}
/**
* Predicate<T> 斷言型接口
*/
@Test
public void testPredicate() {
List<String> list = Arrays.asList("wefasf", "fasdf", "wsdf", "sdf", "sd", "fs");
List<String> list1 = filterStr(list, s -> s.length() < 3);
list1.forEach(System.out::println);
}
public List<String> filterStr(List<String> list, Predicate<String> predicate) {
List<String> strings = new ArrayList<>();
for (String string : list) {
if (predicate.test(string)) {
strings.add(string);
}
}
return strings;
}
/**
* 處理字符串
*
* @param str
* @param fun
* @return
*/
public String strHandle(String str, Function<String, String> fun) {
return fun.apply(str);
}
/**
* 產(chǎn)生指定個數(shù)的整數(shù), 變更放入到集合中
*
* @param num
* @param sup
* @return
*/
public List<Integer> getNumbers(int num, Supplier<Integer> sup) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add(sup.get());
}
return list;
}
/**
* 消費
*
* @param money
* @param consumer
*/
public void happy(double money, Consumer<Double> consumer) {
consumer.accept(money);
}
}
package com.www.java8.test;
import com.www.java8.entity.Employee;
import com.www.java8.inter.MyFunction;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
/**
* 練習
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時間: 2022/8/11 18:42 星期四
* <p>
*/
public class LambdaDemo {
List<Employee> employees = Arrays.asList(
new Employee("w", 21, 9999.99),
new Employee("ww", 31, 6666.66),
new Employee("nw", 31, 6666.66),
new Employee("lw", 31, 6666.66),
new Employee("www", 41, 777.66),
new Employee("l", 1, 5555.555));
/**
* 先根據(jù) 年齡排序啡氢, 年齡一樣時 状囱,根據(jù) 姓名進行排序
*/
@Test
public void test1() {
employees.sort((e1, e2) -> {
if (e1.getAge().equals(e2.getAge())) {
return e1.getName().compareTo(e2.getName());
} else {
return Integer.compare(e2.getAge(), e1.getAge());
}
});
for (Employee emp : employees) {
System.out.println(emp);
}
}
/**
* 處理
*/
@Test
public void test2() {
System.out.println("去除空格:");
String s = strHandler("\t\t\t 我愛中國", String::trim);
System.out.println(s);
System.out.println("將字母轉換成 大寫:");
String sdfsdf = strHandler("sdfsdf", String::toUpperCase);
System.out.println(sdfsdf);
System.out.println("截取字符串:");
System.out.println(strHandler("wsdfgasdf我愛中國", str -> str.substring(str.length() - 4)));
}
/**
* 處理字符串
*
* @param str
* @param fun
* @return
*/
public String strHandler(String str, MyFunction fun) {
return fun.getValue(str);
}
}
MyFunction
package com.www.java8.inter;
/**
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時間: 2022/8/11 18:50 星期四
* <p>
*/
@FunctionalInterface
public interface MyFunction {
/**
* 將 str 返回
*
* @param str
* @return
*/
public String getValue(String str);
}