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 }