JDK1.8开始为了简化使用者进行代码的开发,专门提供有Lambda表达式的支持,利用此方法可以实现函数式编程。函数式编程比较著名的语言:haskell、Scala。利用函数时的变成可以避免掉面向对象编程的一些繁琐的处理问题。
Lambda表达式如果想要使用,那么必须保证只有一个方法,除此之外没有任何其他的方法定义。这种接口也被称为函数式接口。
对于Lambda而言,提供有如下几种格式:
1.方法没有参数:()->{};
2.方法有参数:(参数,参数)->语句;
方法的引用
1.引用静态方法: 类名称::static方法名称
2.引用某个实例对象的方法: 实例化对象::普通方法
3.引用特定类型的方法: 特定类::普通方法
4.引用构造方法: 类名称::new
静态方法代码:
利用方法引用这一概念可以为一个方法定义多个名字,到那时要求必须是函数式接口。
实例对象方法代码:
引用特定类的普通方法:
构造方法的引用:
package com.test;
class Person{
int age;
String name;
public Person(String name,int age) {
this.name = name;this.age = age;
}
public String toString() {
return name +" "+ age;
}
}
@FunctionalInterface
interface IFunction<R>{
public R create(String s,int a);
}
public class Demo {
public static void main(String[] args) {
IFunction<Person> fun = Person :: new;
System.out.println(fun.create("test", 11));
}
}
内建函数式接口
在JDK1.8之中提供有Lambda表达式也提供方法引用,但是测试的时候需要使用“@FunctionalInterface”注解来进行大量声明。
在Java,util.function的开发包可以直接使用函数式接口。
1.功能性函数接口:
FunctionalInterface public interface Function
{ public R apply(T t); }
package com.test;
import java.util.function.*;
public class Demo {
public static void main(String[] args) {
Function<String,Boolean> func = "**Hello"::startsWith;
System.out.println(func.apply("**"));
}
}
//true
2.消费性函数式接口
public interface Consumer
{ public void accept(T t); }
package com.test;
import java.util.function.*;
public class Demo {
public static void main(String[] args) {
Consumer<String> func = System.out :: println;
func.accept("test");
}
}
//test
3.供给型函数时接口
public interface Supplier
{ public T get();
}
package com.test;
import java.util.function.*;
public class Demo {
public static void main(String[] args) {
Supplier<String> sup = "Test" :: toLowerCase;
System.out.println(sup.get());
}
}
//test
4.断言型函数接口
public interface Predicate
{ public boolean test(T t); }
package com.test;
import java.util.function.*;
public class Demo {
public static void main(String[] args) {
Predicate<String> pre = "Test" :: equalsIgnoreCase;
System.out.println(pre.test("test"));
}
}
//true
如果Java开发中,JDK本身提供的函数式接口可以被我们所使用,那么就没有必要定义。