Lambda8新特性入门

Lambda8新特性入门

在我们日常的开发过程中,避免不了会写一点简单的函数,比如说,将每个人的年龄乘以二返回,判断年龄是否大于18等等,若是每次碰到这种的问题,我们都去写一个函数的话,好像是有点麻烦的,但是在java8中,将这些函数全部封装了,大概分为如下四种

名称描述对应的方法入参(类型)出参(类型)
Function<S,T>功能型applyYY(T)
Consumer消费者型acceptYN
Supplier申请型getNY
Predicate判断型testYY

示例

Function

  • 使用场景: 通过输入某一个值,在处理后也需要返回对应的结果值

  • 接受类型为String

  • 返回类型为Integer

Function<String, Integer> function = s ->{
    return 1;
};
System.out.println (function.apply ("200"));

Consumer

  • 使用场景:通过输入某种值,不在意返回结果,一般多数用于流式计算

  • 接受类型为String

  • 没有返回值

Consumer<String> consumer = s -> {
    System.out.println (s + "22");
};
consumer.accept ("dasdsa");

Supplier

  • 使用场景:没有入参,但是希望获取到某种返回值,一般多用于获取某种池化资源,比如说获取jedis的连接,数据库的连接等等

  • 不需要接受参数

  • 返回的类型为String

Supplier<String> supplier = () -> {
    return "wew";
};
System.out.println (supplier.get ());

Predicate

  • 使用场景:接受一个String类型的参数,将这个参数进行了逻辑运算,最后的需要给返回一个 0/1 的逻辑值,比如是在判断某个学生的年纪是否大于14等等

  • 接受的类型为String

  • 返回的类型永远都是bool

Predicate<String> predicate = s -> {
    return s.length () > 0;
};
System.out.println (predicate.test ("ewe"));

上述的这些看起来好像有点太简单了,那我们来点高级的吧

给出如下代码片段,打印出年龄>=18,性别是’’,的人的id或者名字并返回一条

List<Student> studentList = new ArrayList<>();
		studentList.add(new Student(1, "张三", 10, "男"));
        studentList.add(new Student(2, "李四", 7, "男"));
        studentList.add(new Student(3, "西施", 20, "女"));
        studentList.add(new Student(4, "貂蝉", 18, "女"));

解题思路

  • 循环list过滤出年龄 >= 18 得到集合 list1

  • 循环list1,过滤出性别=‘女’ 得到集合list2

  • 循环打印出list2

    大致代码如下

     List<Student> list1 = new ArrayList<>();
            for (Student student : studentList){
                if (student.getAge() >= 18){
                    list1.add(student);
                }
            }
            List<Student> list2 = new ArrayList<>();
            for (Student student : list1){
                if ("女".equals(student.getSex())){
                    list2.add(student);
                }
            }
    
            System.out.println(list2.get(0));
    

    好像看起来有点多,并且有很多比较重复的代码,但是总体的逻辑是比较清晰的,没啥毛病, 那么有没有一种优化的写法呢???

优化版本

这里考虑通过上述的jdk提供的方法几种方法,具体的代码如下

        String studentName = studentList.stream()
                .filter(x -> x.getAge() >= 18)
                .filter(x -> "女".equals(x.getSex()))
                .map(Student::getName)
                .collect(Collectors.toList())
                .get(0);
        System.out.println(studentName);

代码经过一番改造,比起之前的版本要规整(优雅)了很多,在后续的代码中我们可以经常性的使用这种流式编程,可以大大的简单我们代码可读性。

在上述的几个函数中,分别接受如下的几个参数类型

  • filter
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate)
  • map
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper)

以上就是这次分享的内容,欢迎大家一起交流与探讨~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值