安装JDK1.8已经很长一段时间了,却没有了解过1.8的新特性,被人问了好几次都回答不上来,于是体验一把。
话不多说,什么是函数式接口?
函数式接口指的是只有单个抽象方法的接口,用来表达Lambda表达式的类型。在java.util.function包下给出了很多函数式接口,这里我只体验了Function和Predicate接口。
Function接口的定义是:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
Function接口的功能是接受一个T类型的参数,经过处理后返回一个R类型的结果,apply()是它的抽象方法
Pridicate接口的定义是:@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Pridicate接口的功能是对于判断T类型参数是否符合某种规则,返回布尔型结果,test()是它的抽象方法
那么什么是Lambda表达式?
Lambda表达式只是名字听起来比较高端,其实就是一个匿名方法,它和函数式接口一起使用,整个表达式实现一个方法的功能。Lambda表达式的一个关键标记就是“->”
用一个例子来说明如何使用这两个接口以及Lambda表达式,我实现了一个简单的计算器,用Predicate()接口判断输入是否合法,用Function()接口进行计算
package org.lambda;
import java.util.function.Function;
import java.util.function.Predicate;
public class IFunction {
public static boolean judge(String s)
{
Predicate<String>predicate=x->{
//Predicate实例会接受{};中的返回值
String opt="+-*/";
for(int i=0;i<s.length();i++){
if(opt.contains(s.charAt(i)+""))
return true;
}
return false;
};//Lambda表达式判断输入字符串是否合法
return predicate.test(s);
//predicate调用Predicate()接口的test方法把参数交给{};处理
}
public static String calculator(String s)
{
Function<String, Integer>function=x->{
String opt="+-*/";
char operation=' ';
for(int i=0;i<s.length();i++){
if(opt.contains(s.charAt(i)+"")){
operation=s.charAt(i);
}
}
String com=operation+"";
String num[]=s.split("\\"+com);
Integer res=0;
switch(operation){
case '+':
res=Integer.parseInt(num[0])+Integer.parseInt(num[1]);
return res;
case '-':
res=Integer.parseInt(num[0])-Integer.parseInt(num[1]);
return res;
case '*':
res=Integer.parseInt(num[0])*Integer.parseInt(num[1]);
return res;
case '/':
res=Integer.parseInt(num[0])/Integer.parseInt(num[1]);
return res;
default:
return 0;
}
};
return s+"="+function.apply(s);
}
public static void main(String[] args) {
String s="10+4";
if(judge(s)==false)
System.out.println("wrong expression");
else
System.out.println(calculator(s));
}
}