Java之——Java8 自定義函式程式設計
參考:
https://www.cnblogs.com/figure9/p/java-8-lambdas-insideout-language-features.html
https://blog.csdn.net/ioriogami/article/details/12782141
一、FunctionalInterface描述
Jdk8 就提供了 FunctionalInterface 的註解來幫助我們。
Java8中對FunctionalInterface註解的宣告如下:
@Documented @Retention(value=RUNTIME) @Target(value=TYPE) public @interface FunctionalInterface
其中,@Target(value=TYPE)表明@FunctionalInterface註解可用於類、介面(包括註釋型別),或列舉宣告 。
注:@Target中value的可取如下值:
- TYPE
public static final ElementType TYPE
類、介面(包括註釋型別),或列舉宣告
- FIELD
public static final ElementType FIELD
現場申報(包括列舉常量)
- METHOD
public static final ElementType METHOD
方法的宣告
- PARAMETER
public static final ElementType PARAMETER
形式引數宣告
- CONSTRUCTOR
public static final ElementType CONSTRUCTOR
建構函式的宣告
- LOCAL_VARIABLE
public static final ElementType LOCAL_VARIABLE
區域性變數宣告
- ANNOTATION_TYPE
public static final ElementType ANNOTATION_TYPE
註釋型別宣告
- PACKAGE
public static final ElementType PACKAGE
包裝宣告
- TYPE_PARAMETER
public static final ElementType TYPE_PARAMETER
型別引數宣告
從以下版本開始:
一點八
- TYPE_USE
public static final ElementType TYPE_USE
一種型別的使用
從以下版本開始:
一點八
接下來我們就一起實現Java8的自定義函式程式設計。
二、具體實現
1、建立自定義函式介面MyFunction
package com.lyz.java8.customer.function;
/**
* 自定義函式MyFunction,提供handler介面, 傳入的是T,返回的是R
* @author liuyazhuang
*
* @param <T>
* @param <R>
*/
@FunctionalInterface
public interface MyFunction<T, R> {
/**
* 傳入T,返回R
* @param t1
* @param t2
* @return R
*/
R handler(T t1, T t2);
}
2、建立Person類
package com.lyz.java8.customer.function.entity;
/**
* 自定義的Person類
* @author liuyazhuang
*
*/
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
3、建立測試自定義函式程式設計類FunctionTest
由於FunctionTest類中的註釋已經很詳細了,這裡我就不再對每個方法一一列舉了,大家直接看如下的程式碼,一看便知:
package com.lyz.java8.customer.function;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import com.lyz.java8.customer.function.entity.Person;
/**
* 測試自定義函式程式設計
* @author liuyazhuang
*
*/
public class FunctionTest {
/**
* 利用自定義函式程式設計計算x + y
* @param x 第一個引數值x
* @param y 第二個引數值y
* @param myFunction 自定義的函式介面
* @return x + y
*/
public Long getAdd(Long x, Long y, MyFunction<Long, Long> myFunction) {
return myFunction.handler(x, y);
}
@Test
public void testGetAdd() {
Long result = getAdd(1L, 2L, (x, y) -> {
return x + y;
});
System.out.println("計算得出的結果為:" + result);
}
/**
* 利用自定義函式程式設計將int型別轉化為Spring型別
* @param x 第一個int數字
* @param y 第二個int數字
* @param myFunction 自定義的函式介面
* @return 將int轉化為Spring的結果
*/
public String getIntToString(int x, int y, MyFunction<Integer, String> myFunction) {
return myFunction.handler(x, y);
}
@Test
public void testGetIntToString() {
String result = getIntToString(18, 20, (x, y) -> {
return "小明的年齡在".concat(String.valueOf(x)).concat("歲到").concat(String.valueOf(y)).concat("歲之間");
});
System.out.println(result);
}
/**
* 利用自定義函式程式設計通過姓名和年齡過濾Person列表
* @param x 引數x
* @param y 引數y
* @param myFunction 自定義的函式介面
* @return 過濾後的Person列表
*/
public List<Person> getPersonsByNameAndAge(String x, String y, MyFunction<String, List<Person>> myFunction){
return myFunction.handler(x, y);
}
@Test
public void testGetPersonsByNameAndAge() {
List<Person> list = Arrays.asList(
new Person("劉亞壯", 20),
new Person("張三", 26),
new Person("李四", 27),
new Person("小明", 18),
new Person("小李", 30)
);
String name = "小明";
String age = "18";
List<Person> persons = getPersonsByNameAndAge(name, age, (x, y) -> {
List<Person> subPersons = list.stream().filter(p -> p.getAge() >= Integer.parseInt(y) && p.getName().equals(x)).collect(Collectors.toList());
return subPersons;
});
persons.stream().forEach(System.out::println);
}
}