函数函数接口Java示例

时间:2020-01-09 10:35:14  来源:igfitidea点击:

在本文中,我们将看到java.util.function.Function函数接口的示例。

函数函数接口表示一种接受一个参数并产生结果的操作。该功能接口中的抽象方法是

R apply(T t)–此处T是传递给方法的参数的类型,它返回类型R的值。

如果编写的Lambda表达式采用一种类型的单个参数并返回另一种类型(甚至相同类型)的值,则可以将该Lambda表达式编写为Function内置函数接口的实现。

除了apply()抽象方法外,Function()接口还具有以下默认方法和静态方法。

  • andThen(Function <?super R,?之后扩展V>)–这是一个默认方法,该方法将另一个Function用作参数,并返回一个组合的Function,该Function依次执行先执行调用Function的操作,然后执行after操作。
  • compose(Function <?super V,?在之前扩展T>)–这是Function接口中的默认方法,该方法将另一个Function用作参数,并返回一个组合函数,该函数按顺序执行先执行before操作,然后执行调用的操作功能。
  • identity()–这是一个静态方法,它返回一个函数,该函数返回其输入参数。

功能接口apply()方法示例

1.编写一个函数,该函数返回传递的字符串的长度。

public class FunctionExample {
	public static void main(String[] args) {
		Function<String, Integer> function = (s) -> s.length();
		System.out.println("Length- " + function.apply("Test"));
		System.out.println("Length- " + function.apply("Retrospective"));
	}
}

输出:

Length- 4
Length- 13

在示例语句中Function <String,Integer> function =(s)-> s.length();是函数接口作为lambda表达式的实现。

调用function.apply()方法时,Java可以从上下文中推断出lambda表达式是apply()方法的实现。

2.查找数字的阶乘作为lambda表达式可以实现为Function接口的实例,其中输入参数是Integer,返回值是Double类型。

import java.util.function.Function;

public class FunctionExample {
	public static void main(String[] args) {
		double result = factorial(10);
		System.out.println("Factorial- " + result);

	}
	
	public static double factorial(int n) {
	   Function<Integer, Double> function =  x -> (x == 0) ? 1 : x * factorial(x - 1);
	   return function.apply(n);
	}
}

输出:

Factorial- 3628800.0

3.在此函数接口Java示例中,"员工列表"被映射到名称列表。

public class Employee {
	private String name;
	private String dept;
	private int salary;
	
	Employee(String name, String dept, int salary){
		this.name = name;
		this.dept = dept;
		this.salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
}
public class FunctionExample {
	public static void main(String[] args) {
		List<Employee> employeeList = new ArrayList<>(); 

		employeeList.add(new Employee("Hyman", "Finance", 5500)); 
		employeeList.add(new Employee("Lisa", "Finance", 5600)); 
		employeeList.add(new Employee("Scott", "Finance", 7000));
		employeeList.add(new Employee("Nikita", "IT", 4500));
		employeeList.add(new Employee("Tony", "IT", 8000));
		
		List<String> nameList = mapTo(employeeList, (e)->e.getName());
		nameList.forEach(System.out::println);
	}
	
	public static List<String> mapTo(List<Employee> empList, Function<Employee, String>mapper){
		List<String> nameList = new ArrayList<>();
		for(Employee emp : empList) {
			nameList.add(mapper.apply(emp));
		}
		return nameList;
	}
}

输出:

Hyman
Lisa
Scott
Nikita
Tony

在该示例的实现中,将方法实参作为方法参数传递给

mapTo(employeeList, (e)->e.getName());

函数功能接口和Then()方法示例

在该示例中,将在第一个Function上有两个Function接口,然后以第二个Function作为参数调用Then()。现在,在第二个Function接口上调用apply()方法时,它首先执行第一个Function实现,然后执行第二个。

我们将使用前面的"雇员"列表示例,在第一个功能界面中,我们将获取"雇员"的薪水,然后在第二个功能中,将其增加10%。

public class FunctionExample {
	public static void main(String[] args) {
		int fin, it;
		List<Employee> employeeList = new ArrayList<>(); 
		employeeList.add(new Employee("Hyman", "Finance", 5500)); 
		employeeList.add(new Employee("Lisa", "Finance", 5600)); 
		employeeList.add(new Employee("Scott", "Finance", 7000));
		employeeList.add(new Employee("Nikita", "IT", 4500));
		employeeList.add(new Employee("Tony", "IT", 8000));
		Function<Employee, Integer> function = (e)->e.getSalary();
		Function<Integer, Integer> functionAnother =  (Integer i)-> i + ((i * 10)/100);
		List<Integer> salaryList = mapTo(employeeList, function.andThen(functionAnother));
		salaryList.forEach(System.out::println);
	}
	
	public static List<Integer> mapTo(List<Employee> empList, Function<Employee, Integer>mapper){
		List<Integer> salaryList = new ArrayList<>();
		for(Employee emp : empList) {
			salaryList.add(mapper.apply(emp));
		}
		return salaryList;
	}
}

输出:

6050
6160
7700
4950
8800

函数功能接口compose()方法示例

compose()与andThen()相反,首先调用Second Function接口实现,然后是第一个。

在前面的andThen()示例中,如果在第二个函数上调用了compose方法,并且传递了第一个函数接口作为参数,我们将得到与上一个示例相同的结果。

List<Integer> salaryList = mapTo(employeeList, functionAnother.compose(function));

JDK中的功能功能接口

这些内置的功能接口已在JDK本身中广泛使用。使用功能接口的一个很好的例子是Java Stream API中Stream接口的map()方法。

map(Function <?superT,?extended R> mapper)–返回一个流,该流包括将给定函数应用于此流的元素的结果。

可以使用Stream的map()方法编写将Employee对象列表映射到员工姓名列表的示例。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FunctionExample {
	public static void main(String[] args) {
		int fin, it;
		List<Employee> employeeList = new ArrayList<>(); 
		employeeList.add(new Employee("Hyman", "Finance", 5500)); 
		employeeList.add(new Employee("Lisa", "Finance", 5600)); 
		employeeList.add(new Employee("Scott", "Finance", 7000));
		employeeList.add(new Employee("Nikita", "IT", 4500));
		employeeList.add(new Employee("Tony", "IT", 8000));
		// map to name and then collect to a list
		List<String> nameList = employeeList.stream().map((e)->e.getName()).collect(Collectors.toList());
		nameList.forEach(System.out::println);
	}
}

输出:

Hyman
Lisa
Scott
Nikita
Tony