JUC学习笔记-10-四大函数式接口和Stream流式计算

新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算
函数式接口:只有一个方法的接口

10.1 四大函数式接口

10.1.1 Function函数型接口

需传入的泛型类型

  • 第一个泛型是输入值的类型
  • 第二个泛型是返回值的类型
    在这里插入图片描述
import java.util.function.Function;
//四大函数式接口之函数型接口
public class FunctionDemo {
    public static void main(String[] args) {
        //第一个泛型是传入参数类型,第二个泛型返回参数类型
        Function<String, String> function = (str) -> {return str;};
        System.out.println(function.apply("aaaaaaaaaa"));
    }
}

10.1.2 Predicate断定型接口

断定型顾名思义判断输入是否符合预期,故需传入参数
需传入的泛型类型

  • 有且仅有一个泛型是输入值的类型
    在这里插入图片描述
//四大函数式接口之断定型接口,判断返回boolean值
public class PredicateDemo {
    public static void main(String[] args) {
        //传入的泛型是输入值的类型,返回boolean
        Predicate<String> predicate = (str) -> {return str.isEmpty();};
        // false
        System.out.println(predicate.test("aaa"));
        // true
        System.out.println(predicate.test(""));
    }
}

10.1.3 Supplier供给型接口

供给型顾名思义能够获得什么,所以不需要传入参数,直接获得返回值
需传入的泛型类型

  • 有且仅有一个泛型是返回值的类型
    在这里插入图片描述
//供给型接口,只返回,不输入
public class SupplierDemo {
    public static void main(String[] args) {
        //传入的泛型是返回值的类型
        Supplier<String> supplier = ()->{return "1024";};
        System.out.println(supplier.get());
    }
}

10.1.4 Consumer消费性接口

消费性顾名思义便是消费,消费便要钱,所以需要传入输入值的类型
需传入的泛型类型

  • 有且仅有一个泛型是输入值的类型
    在这里插入图片描述
//消费型接口 没有返回值!只有输入!
public class ConsumerDemo {
    public static void main(String[] args) {
        //传入的泛型类型是输入值的参数类型
        Consumer<String> consumer = (str)->{ System.out.println(str); };
        consumer.accept("abc");
    }
}

10.2 Stream流式计算

10.2.1 Stream流的认识

大数据时代 = 存储 + 计算
存储的操作交给集合、数据库来完成
而计算的操作交给流来完成,所以流就是用来实现计算的
流的出现便是让集合操作变得更加简介,通常我们需要多行才能完成的操作,借助于流式处理可以在一行中实现。比如帅选出集合中所有的偶数
集合操作

List<Integer> evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}

通过流操作

List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

可以看出,通过流我们一行代码便可实现的功能,让代码变得更加简洁

10.2.2 Stream流的处理阶段

具体内容参考:Java8新特性流式数据处理
不光是集合,包括数组,文件,音频等,只要可以转换成流的,我们都可以借助于流式处理
在这里插入图片描述

/**
 * 题目要求: 用一行代码实现
 * 1. Id 必须是偶数
 * 2.年龄必须大于23
 * 3. 用户名转为大写
 * 4. 用户名倒序
 * 5. 只能输出一个用户
 **/

public class StreamDemo {
    public static void main(String[] args) {
        User u1 = new User(1, "a", 23);
        User u2 = new User(2, "b", 23);
        User u3 = new User(3, "c", 23);
        User u4 = new User(6, "d", 24);
        User u5 = new User(4, "e", 25);

        List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
        // lambda、链式编程、函数式接口、流式计算
        list.stream()
                .filter(user -> {return user.getId()%2 == 0;})
                .filter(user -> {return user.getAge() > 23;})
                .map(user -> {return user.getName().toUpperCase();})
                .sorted((user1, user2) -> {return user2.compareTo(user1);})
                .limit(1)
                .forEach(System.out::println);
    }
}
class User{
    private int id;
    private String name;
    private int age;
    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值