JDK1.8开始为了简化使用者进行代码的开发,专门提供有Lambda表达式的支持,利用此方法可以实现函数式编程。函数式编程比较著名的语言:haskell、Scala。利用函数时的变成可以避免掉面向对象编程的一些繁琐的处理问题。
Lambda表达式如果想要使用,那么必须保证只有一个方法,除此之外没有任何其他的方法定义。这种接口也被称为函数式接口。
image.png
对于Lambda而言,提供有如下几种格式:
1.方法没有参数:()->{};
2.方法有参数:(参数,参数)->语句;

方法的引用

1.引用静态方法: 类名称::static方法名称
2.引用某个实例对象的方法: 实例化对象::普通方法
3.引用特定类型的方法: 特定类::普通方法
4.引用构造方法: 类名称::new

静态方法代码:
image.png
利用方法引用这一概念可以为一个方法定义多个名字,到那时要求必须是函数式接口。

实例对象方法代码:
image.png

引用特定类的普通方法:
image.png

构造方法的引用:

  1. package com.test;
  2. class Person{
  3. int age;
  4. String name;
  5. public Person(String name,int age) {
  6. this.name = name;this.age = age;
  7. }
  8. public String toString() {
  9. return name +" "+ age;
  10. }
  11. }
  12. @FunctionalInterface
  13. interface IFunction<R>{
  14. public R create(String s,int a);
  15. }
  16. public class Demo {
  17. public static void main(String[] args) {
  18. IFunction<Person> fun = Person :: new;
  19. System.out.println(fun.create("test", 11));
  20. }
  21. }

内建函数式接口

在JDK1.8之中提供有Lambda表达式也提供方法引用,但是测试的时候需要使用“@FunctionalInterface”注解来进行大量声明。
在Java,util.function的开发包可以直接使用函数式接口。

1.功能性函数接口:

FunctionalInterface public interface Function{ public R apply(T t); }

  1. package com.test;
  2. import java.util.function.*;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. Function<String,Boolean> func = "**Hello"::startsWith;
  6. System.out.println(func.apply("**"));
  7. }
  8. }
  9. //true

2.消费性函数式接口

public interface Consumer{ public void accept(T t); }

  1. package com.test;
  2. import java.util.function.*;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. Consumer<String> func = System.out :: println;
  6. func.accept("test");
  7. }
  8. }
  9. //test

3.供给型函数时接口

public interface Supplier{

public T get();

}

  1. package com.test;
  2. import java.util.function.*;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. Supplier<String> sup = "Test" :: toLowerCase;
  6. System.out.println(sup.get());
  7. }
  8. }
  9. //test

4.断言型函数接口

public interface Predicate{ public boolean test(T t); }

  1. package com.test;
  2. import java.util.function.*;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. Predicate<String> pre = "Test" :: equalsIgnoreCase;
  6. System.out.println(pre.test("test"));
  7. }
  8. }
  9. //true

如果Java开发中,JDK本身提供的函数式接口可以被我们所使用,那么就没有必要定义。