1. 程式人生 > >Java之——Java8 自定義函式程式設計

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