Java8 Lambda 流式编程

本文介绍了一个CRM系统中任务视图服务的具体实现,通过整合客户数据、订单信息及任务详情,提供定制化的客户视图数据。服务利用Spring框架、Guava库及Lombok简化了代码,展示了如何通过数据库映射获取并处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.sitech.crmpd.service;

import com.google.common.collect.Lists;
import com.sitech.crmpd.annotation.SystemHttpLog;
import com.sitech.crmpd.domain.CustViewDataDTO;
import com.sitech.crmpd.exception.HoException;
import com.sitech.crmpd.exception.HoStatus;
import com.sitech.crmpd.mapper.ContactTaskInfoMapper;
import com.sitech.crmpd.mapper.HuaxiaoOrderMapper;
import com.sitech.crmtpd.mapper.ContactOrderMapper;
import com.sitech.crmtpd.market.domain.ContactOrder;
import com.sitech.crmtpd.market.domain.ContactOrderExample;
import lombok.extern.slf4j.Slf4j;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**
 * @oauth: qiangSW
 * @date: 2019/11/20 13:48
 * @description: com.sitech.crmpd.service
 * @doc:
 */
@Slf4j
@Service
public class ViewTaskService {

    @Autowired
    private HuaxiaoOrderMapper huaxiaoOrderMapper;
    @Autowired
    private ContactOrderMapper orderMapper;
    @Autowired
    private ContactTaskInfoMapper contactTaskInfoMapper;

    /**
     * 
     *
     * @param custId
     * @param viewItemCat
     * @return
     */
    public CustViewDataDTO custViewData(String custId, String viewItemCat) {
        List<Map> user = huaxiaoOrderMapper.selectHoldByCustId(custId);
        CustViewDataDTO custViewDataDTO = new CustViewDataDTO();
        List<CustViewDataDTO.ContactTaskList> contactTaskLists = Lists.newArrayList();
        custViewDataDTO.setViewItemCat(viewItemCat);
        custViewDataDTO.setProCode("8140000");
        return Optional.ofNullable(user)
                .filter(a -> CollectionUtils.isNotEmpty(a) && !a.get(0).isEmpty())
                .map(b -> {
                    String idNo = b.get(0).get("ID_NO").toString();
                    ContactOrderExample orderExample = new ContactOrderExample();
                    orderExample.createCriteria().andTargetObjNbrEqualTo(idNo);
                    List<ContactOrder> contactOrderList = orderMapper.selectByExample(orderExample);
                    return Optional.ofNullable(contactOrderList)
                            .filter(list -> CollectionUtils.isNotEmpty(list))
                            .map(c -> {
                                return cust(c.get(0), val -> {
                                    List<Map<String, Object>> list = Lists.newArrayList();
                                    list.addAll(contactTaskInfoMapper.taskDetail(val.getTargetObjNbr()));
                                    list.stream()
                                            .filter(map -> null != map && !map.isEmpty())
                                            .forEach(taskList -> {
                                                CustViewDataDTO.ContactTaskList createTask = custViewDataDTO.new ContactTaskList();
                                                createTask.setPushType(String.valueOf(taskList.get("PUSHTYPE")));
                                                createTask.setContactDate(String.valueOf(taskList.get("CONTACTDATE")));
                                                createTask.setContactTaskTitle(String.valueOf(taskList.get("CONTACTTASKTITLE")));
                                                createTask.setContactScript(String.valueOf(taskList.get("CONTACTSCRIPT")));
                                                createTask.setContactChlId(String.valueOf(taskList.get("CONTACTCHLID")));
                                                createTask.setCustId(custId);
                                                createTask.setCustName(String.valueOf(user.get(0).get("USER_NAME")));
                                                contactTaskLists.add(createTask);
                                            });
                                    custViewDataDTO.setContactTaskList(contactTaskLists);
                                    return custViewDataDTO;
                                });
                            }).orElseGet(() -> {
                                CustViewDataDTO.ContactTaskList createTask = custViewDataDTO.new ContactTaskList();
                                contactTaskLists.add(createTask);
                                custViewDataDTO.setContactTaskList(contactTaskLists);
                                return custViewDataDTO;
                            });
                }).orElseGet(() -> {
                    CustViewDataDTO.ContactTaskList createTask = custViewDataDTO.new ContactTaskList();
                    contactTaskLists.add(createTask);
                    custViewDataDTO.setContactTaskList(contactTaskLists);
                    return custViewDataDTO;
                });


    }

    public CustViewDataDTO cust(ContactOrder order, Function<ContactOrder, CustViewDataDTO> function) {

        CustViewDataDTO apply = function.apply(order);
        return apply;
    }
}

2 自定义收集器 

package com.test;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;


/**
 * @param Collection<T>  要收集的元素的泛型
 * @param   List<T> 累加器容器类型
 * @param  List<T> 收集返回的结果
 */
public class CollectorListToList<T> implements Collector<Collection<T>, List<T>, List<T>> {

    /**
     *  创建接收容器
     * @return
     */
    @Override
    public Supplier<List<T>> supplier() {
        return ArrayList::new;
    }

    /**
     * 将流中的元素放入可变方法容器
     * @return
     */
    @Override
    public BiConsumer<List<T>, Collection<T>> accumulator() {
        return List::addAll;
    }

    /**
     * 组合结果:流被拆分多个部分,需要将多个结果合并
     * @return
     */
    @Override
    public BinaryOperator<List<T>> combiner() {
        return (list1,list2)->{
             list1.addAll(list2);
            return list1;
        };
    }
    /**
     * 最后调用,在遍历完流后将结果容器A转换结果R
     * @return
     */
    @Override
    public Function<List<T>, List<T>> finisher() {
        return Function.identity();
    }
    /**
     *  返回一个描述收集器特征不可以变集合,用于告诉收集器可以进行那些优化,比如并行
     *  1 CONCURRENT
     *   意味着结果容器支持多线程并发操作accumulator()方法向容器中放入元素。
     *   如果收集器没有被同时标记为无序的`UNORDERED`,则该特征只在数据源为无序(如set)时才有效
     *  2 UNORDERED
     *    规约操作不保证集合中元素的顺序.如结果容器为Set的场景下
     *  3 IDENTITY_FINISH
     *  表明`完成方法finisher`是一个恒等式,可以被忽略,累加器的结果combiner A 将会作为最终的结果R
     *  这也要求,直接将A转换成R是安全的
     * @return
     */
    @Override
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值