Java8—-函数式接口

  • Consumer—-消费者(accept方法,Lambda与方法引用返回都是Consumer)
  • Supplier—-供给型(get方法,返回数据,与Optional可以联用)
  • Predicate—-谓词性(test方法,起到判断作用,)
  • Function—-功能性(apply方法,转换数据)

Java8-四个函数式接口(Consumer,Supplier,Predicate,Function) - 图1

1.Consumer消费者
  1. package Java;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.function.Consumer;
  5. import java.util.stream.Stream;
  6. /**
  7. * @ProjectName: Consumer_Test
  8. * @Package: Java
  9. * @Description: 消费者---Lambda和方法引用返回都是Consumer
  10. * @Author: huyuqiao
  11. * @CreateDate: 2020/9/18 18:10
  12. */
  13. /*① Consumer是一个接口,并且只要实现一个 accept 方法,就可以作为一个**“消费者”**输出信息。 ② 其实,lambda 表达式、方法引用的返回值都是 Consumer 类型,所以,他们能够作为 forEach 方法的参数,并且输出一个值。*/
  14. public class Consumer_Test {
  15. public static void main(String[] args){
  16. //匿名内部类
  17. Consumer<String> consumer = new Consumer<String>() {
  18. @Override
  19. public void accept(String s) {
  20. System.out.println(s);
  21. }
  22. };
  23. List list = new ArrayList();
  24. Stream<String> stream = Stream.of("aaa", "bbb", "ccc", "ddd");
  25. stream.forEach(consumer);
  26. System.out.println("********************");
  27. //Lambda
  28. stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
  29. Consumer<String> consumer1 = s -> System.out.println(s);
  30. stream.forEach(consumer1);
  31. System.out.println("********************");
  32. //方法引用
  33. stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
  34. Consumer consumer2 = System.out::println;
  35. stream.forEach(consumer);
  36. }
  37. }

2.Supplier供应者
  1. package Java;
  2. import com.sun.org.apache.bcel.internal.generic.NEW;
  3. import javax.swing.text.html.Option;
  4. import java.util.Optional;
  5. import java.util.Random;
  6. import java.util.function.Supplier;
  7. import java.util.stream.Stream;
  8. /**
  9. * @ProjectName: Supplier_Test
  10. * @Package: Java
  11. * @Description: 供给型-配合optional
  12. * @Author: huyuqiao
  13. * @CreateDate: 2020/9/18 18:47
  14. */
  15. /*① Supplier 接口可以理解为一个容器,用于装数据的。 ② Supplier 接口有一个 get 方法,可以返回值。
  16. */
  17. public class Supplier_Test {
  18. public static void test_Supplier2(){
  19. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
  20. Optional<Integer> first = stream.filter(integer -> integer > 6).findFirst();
  21. //orElse,如果first中存在数,就返回这个数,如果不存在,就放回传入的数
  22. System.out.println(first.orElse(777));
  23. System.out.println("********************");
  24. Supplier<Integer> supplier = new Supplier<Integer>() {
  25. @Override
  26. public Integer get() {
  27. return new Random().nextInt();
  28. }
  29. };
  30. //orElseGet,如果first中存在数,就返回这个数,如果不存在,就返回supplier返回的值
  31. System.out.println(first.orElseGet(supplier));
  32. }
  33. public static void test_Supplier(){
  34. Supplier<Integer> supplier = new Supplier<Integer>() {
  35. @Override
  36. public Integer get() {
  37. return new Random().nextInt();
  38. }
  39. };
  40. System.out.println(supplier.get());
  41. System.out.println("********************");
  42. supplier = () -> new Random().nextInt();
  43. System.out.println(supplier.get());
  44. System.out.println("********************");
  45. Supplier<Double> supplier1 = Math::random;
  46. System.out.println(supplier1.get());
  47. }
  48. public static void main(String[] args){
  49. test_Supplier2();
  50. }
  51. }

3.Predicate谓词性
  1. package Java;
  2. import java.util.function.Predicate;
  3. /**
  4. * @ProjectName: Predicate_Test
  5. * @Package: Java
  6. * @Description: 谓词型-判断
  7. * @Author: huyuqiao
  8. * @CreateDate: 2020/9/18 19:02
  9. */
  10. /*① Predicate 是一个谓词型接口,其实只是起到一个判断作用。 ② Predicate 通过实现一个 test 方法做判断。*/
  11. public class Predicate_Test {
  12. public static void main(String[] args){
  13. Predicate<Integer> predicate = new Predicate<Integer>() {
  14. @Override
  15. public boolean test(Integer integer) {
  16. if (integer > 5){
  17. return true;
  18. } else {
  19. return false;
  20. }
  21. }
  22. };
  23. System.out.println(predicate.test(6));
  24. System.out.println("********************");
  25. predicate = integer -> integer > 5;
  26. System.out.println(predicate.test(5));
  27. }
  28. }

4.Function功能性
  1. package Java;
  2. import java.util.function.Function;
  3. import java.util.stream.Stream;
  4. /**
  5. * @ProjectName: Function_Test
  6. * @Package: Java
  7. * @Description:
  8. * @Author: huyuqiao
  9. * @CreateDate: 2020/9/18 19:12
  10. */
  11. /*① Function 接口是一个功能型接口,是一个转换数据(求长度,大小等)的作用。 ② Function 接口实现 apply 方法来做转换。
  12. */
  13. public class Function_Test {
  14. public static void main(String[] args){
  15. Function<String, Integer> function = new Function<String, Integer>() {
  16. @Override
  17. public Integer apply(String s) {
  18. return s.length();
  19. }
  20. };
  21. Stream<String> stream = Stream.of("aaa", "bbbbb", "ccccccv");
  22. Stream<Integer> stream1 = stream.map(function);
  23. stream1.forEach(System.out::println);
  24. }
  25. }