四大函数式接口
1.函数型 接口-Function <T, R>
- 功能 :接收一个参数,返回一个结果。
- 方法:
R apply(T t);
- 场景 :类型转换、数据映射。
- 例子:
go
Function<String, Integer> func = s -> s.length();
System.out.println(func.apply("Hello")); // 输出 5

2.断定型接口-Predicate
- 功能 :接收一个参数,返回
boolean
值。 - 方法 :
boolean test(T t);
- 场景 :条件判断、过滤。
- 例子
ini
Predicate<Integer> predicate = x -> x > 10;
System.out.println(predicate.test(15)); // true
System.out.println(predicate.test(5)); // false

3.消费型接口-Consumer
- 功能:接收一个参数,没有返回值。
- 方法 :
void accept(T t);
- 场景 :打印日志、消费消息、遍历操作。
- 例子:
ini
Consumer<String> consumer = s -> System.out.println("Hello, " + s);
consumer.accept("World"); // 输出 Hello, World

4.供给型接口 - Supplier
- 功能 :不接收参数,返回一个结果。
- 方法:
T get();
- 场景 :工厂方法、懒加载、随机数生成。
- 例子:
scss
Supplier<Double> supplier = () -> Math.random();
System.out.println(supplier.get()); // 输出随机数

Stream流式计算
Stream流式计算可以很好的简化代码,
下边这个例子:使用到了lambda表达式、链式编程、函数式接口、Stream流式计算
问题:
- 从用户集合中过滤出 id > 3 且 age > 20 的用户
- 取他们的名字并转换为大写
- 按照名字倒序排序
- 取第一个结果
- 打印输出
只能使用一行代码完成。
ini
public class StreamTest {
public static void main(String[] args) {
User user1 = new User(1,"a",18);
User user2 = new User(2,"b",19);
User user3 = new User(3,"c",20);
User user4 = new User(4,"d",21);
User user5 = new User(5,"e",22);
List<User> list = Arrays.asList(user1, user2, user3, user4, user5);
list.stream()
.filter(u->{return u.getId() > 3;})
.filter(u ->{return u.getAge() > 20;})
.map(u ->{return u.getName().toUpperCase();})
.sorted((uu1,uu2) -> {return uu2.compareTo(uu1);})
.limit(1)
.forEach(System.out::println);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class User{
private Integer id;
private String name;
private Integer age;
}
最终输出结果是: E

流式计算里边都使用的是函数式接口。