ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

函数式编程初探(与泛型方法的结合)

2022-03-09 18:04:00  阅读:191  来源: 互联网

标签:Predicate return 编程 list collection test 初探 泛型 action


平时在操作集合时,常常有这么一种需求,就是查找符合某一种条件的元素在不在集合中,比如现在有个List<User>,我们想知道这个集合里有没有名字叫张三的人,有的话会做123,没有的话会做456之类的。

一般我们会写以下代码

     List<User> collect = list.stream().filter(p -> "张三".equals(p.getName())).collect(Collectors.toList());
     if (CollectionUtils.isNotEmpty(collect)){ //do something }else { //do something }

 

如果在一个方法里,需要频繁这么操作,那未免显得有些繁琐,所以可以把这个判断操作抽出来作为一个函数调用,既然是集合,那就需要支持泛型,所以有了以下方法

private <T> boolean findInList(Collection<? extends T> collection, Predicate<? super T> test){
        for (T t : collection) {
            if (test.test(t)){
                return true;
            }
        }
        return false;
    }

 

针对一个集合,给定一个Predicate,遍历这个集合,如果有一个元素满足Predicate的要求,那就返回true,否则返回false,所以上面的判断方法可以简化成

     if (findInList(list,b -> "张三".equals(b.getName()))){
            //do something
        }else {
            //do something
        }

 

更进一步,我们可以把注释的do something也抽象成一个函数式方法,如果我们需要在找到特定元素之后对这个元素做什么,那可以在后面加一个Consumer

private <T> void ifInListDo(Collection<? extends T> collection,Predicate<? super T> test, Consumer<? super T> action){
        for (T t : collection) {
            if (test.test(t)){
                action.accept(t);
            }
        }
    }

比如我们想在找到名字叫张三的人之后输出他的分数,那么就可以有以下代码

ifInListDo(list,a -> "张三".equals(a.getName()),(a)->{System.out.println("张三的分数 : " + a.getScore());});

 

或者我们需要找到这个元素之后返回另一个元素,那可以把Consumer换成Supplier,如下

private <T> T ifInListGet(Collection<? extends T> collection,Predicate<? super T> test, Supplier<? extends T> action){
        for (T t : collection) {
            if (test.test(t)){
                return action.get();
            }
        }
        return null;
    }

 

就可以像这样调用

User b = ifInListGet(list,a -> "张三".equals(a.getName()),()-> User.builder().Name("李四").build());

这个意思是如果list里有张三,那就得到了一个叫李四的User对象

 

最后,如果我们找到张三后,想根据张三的某些属性返回一个新对象,那可以将Supplier换成原始的Function

private <T> T ifInListGet(Collection<? extends T> collection,Predicate<? super T> test, Function<? super T, ? extends T> action){
        for (T t : collection) {
            if (test.test(t)){
                return action.apply(t);
            }
        }
        return null;
    }

 

调用如下

User b = ifInListGet(list,a -> "张三".equals(a.getName()),(b)-> User.builder().Name("李四").Score(b.getScore()).build());

 

就是讲张三的分数赋值给新返回的李四了

 

函数式风格的代码比较简洁流畅,但是可维护性就见仁见智了,以上

 

标签:Predicate,return,编程,list,collection,test,初探,泛型,action
来源: https://www.cnblogs.com/cloxi/p/15986347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有