2022.8.21 四大函数式接口与Stream流式计算

12、四大函数式接口(重点)

函数接口:只有一个方法的接口

1  @FunctionalInterface
2  public interface Runnable {
3    
4      public abstract void run();
5  }
6  //超级多@FunctionalInterface
7  //减缓编程模型,在新版本中的框架底层大量应用
8  //foreach(消费者类型的函数式接口)

1、Function函数式接口

 1  package com.xing.function;
 2  3  import java.util.function.Function;
 4  5  /**
 6   * Function 函数型接口  有一个输入参数 一个输出参数
 7   * 只要是函数结构就可以用lambda简化
 8   */
 9  public class demo01 {
10      public static void main(String[] args) {
11          //工具类:输出输入的值          参数的类型   返回值类型   
12          /*Function function = new Function<String,String>() {
13              @Override
14              public String apply(String str) {
15                  return str;
16              }
17          };*/
18 19          // Function<String,String> function = (参数) ->{代码;};
20 21          Function<String,String> function = (str) ->{return str;};
22          System.out.println(function.apply("ads"));
23      }
24  }

 

2、Predicate 断定型接口

有一个输入参数,返回值只能是 布尔值!

 1  package com.xing.function;
 2  3  import java.util.function.Predicate;
 4  /*
 5  断定型接口:有一个输入参数,返回值只能是boolean值
 6   */
 7  public class demo02 {
 8      public static void main(String[] args) {
 9          //判断字符串是否为空                         参数的类型
10         /* Predicate<String> predicate = new Predicate<String>(){
11              @Override
12              public boolean test(String str) {
13                 return str.isEmpty();
14              }
15          };*/
16          
17          Predicate<String> predicate = (str) -> {return str.isEmpty();};
18          
19          System.out.println(predicate.test(""));//true
20          System.out.println(predicate.test("1"));//false
21      }
22  }

3、Consumer 消费型接口

 1  package com.xing.function;
 2  3  import java.util.function.Consumer;
 4  /*
 5  Consumer 消费型接口:只有输入,没有返回值
 6   */
 7  public class demo03 {
 8      public static void main(String[] args) {
 9          //                                        参数类型
10          /*Consumer<String>  consumer = new Consumer<String>() {
11              @Override
12              public void accept(String str) {
13                  System.out.println(str);
14              }
15          };*/
16          Consumer<String> consumer = (str) -> {
17              System.out.println(str);
18          };
19          consumer.accept("asb");//asb
20      }
21  }
22

4、Supplier 供给型接口

 1  package com.xing.function;
 2  3  import java.util.function.Supplier;
 4  /*
 5  supplier 供给型接口,不需要输入只有返回值
 6   */
 7  public class demo04 {
 8      public static void main(String[] args) {
 9         //                                返回值类型
10         /* Supplier supplier = new Supplier<Integer>(){
11              @Override
12              public Integer get() {
13                  System.out.println("get()");
14                  return 1024;
15              }
16          };*/
17          Supplier<Integer> supplier = () -> {return 1024;};
18          System.out.println(supplier.get());//1024
19      }
20  }

13、Stream流式计算(重点)

大数据:存储+计算

集合、MySQL本质就是存储东西的;计算都应该交给流!

常见使用方法:map(对对象进行操作)filter(对对象进行过滤)sorted(排序)limit(限制输出数量)

 1  package com.xing.stream;
 2  3  import java.util.Arrays;
 4  import java.util.List;
 5  import java.util.Locale;
 6  7  /**
 8   * 题目要求:一分钟完成此题,只能用一行代码解决
 9   * 现在有五个用户!筛选:
10   * 1.ID必须是偶数
11   * 2.年龄必须大于23岁
12   * 3.用户名转为大写
13   * 4.用户名字母顺序倒序
14   * 5.只输出一个用户
15   */
16  public class Test {
17      public static void main(String[] args) {
18          User u1 = new User(1,"a",21);
19          User u2 = new User(2,"b",22);
20          User u3 = new User(3,"c",23);
21          User u4 = new User(4,"d",24);
22          User u5 = new User(6,"e",25);
23 24          //集合就是存储
25          List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
26 27          //计算交给流,链式编程
28         /*
29         * list.stream():将list转换为流
30         * filter(Predicate<? super T> predicate):过滤 参数为断定型接口  看看断定型接口的简写方式
31         * map(Function<? super T, ? extends R> mapper): 映射 参数为函数式接口
32         * sorted(Comparator<? super T> comparator):排序(默认正序)  参数为消费型接口
33         * limit(long maxSize):输出的数据数
34         */
35          list.stream()
36                  .filter(u->{return u.getId()%2==0;})//判断偶数
37                  .filter(u ->{return u.getAge() >23;})//判断大于23岁
38                  .map(u -> {return u.getName().toUpperCase(Locale.ROOT);})//名字大写
39                  //.sorted((uu1,uu2)->{return uu1.compareTo(uu2);})//正序
40                  .sorted((uu1,uu2)->{return uu2.compareTo(uu1);})//倒序
41                  .limit(1)
42                  .forEach(System.out::println);//输出 E
43 44 45      }
46  }
47  class User{
48      private int id;
49      private String name;
50      private  int age;
51 52      public User(int id, String name, int age) {
53          this.id = id;
54          this.name = name;
55          this.age = age;
56      }
57 58      public int getId() {
59          return id;
60      }
61 62      public String getName() {
63          return name;
64      }
65 66      public int getAge() {
67          return age;
68      }
69 70      public void setId(int id) {
71          this.id = id;
72      }
73 74      public void setName(String name) {
75          this.name = name;
76      }
77 78      public void setAge(int age) {
79          this.age = age;
80      }
81 82      @Override
83      public String toString() {
84          return "User{" +
85                  "id=" + id +
86                  ", name='" + name + '\'' +
87                  ", age=" + age +
88                  '}';
89      }
90  }
posted @ 2022-08-21 21:46  暴躁C语言  阅读(15)  评论(0编辑  收藏  举报