java 动态 lambda

Posted 正怒月神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 动态 lambda相关的知识,希望对你有一定的参考价值。

最近有需求,需要根据配置文件,

动态的 过滤+聚合 数据

想想就写了动态的lambda,方便使用。

目前只有 filter和group。并且没有测试过性能。

如果大家使用的话,先将就一下,或者自己改改。

一,主要方法类

通过反射,来组装lambda。

主要使用方法:

getFiledValue
getDataListFilter
getDataListGroup
package com.leadtrans.report.common;

import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author: Tyler
 * @createDate: 2021/12/9
 */


public class ReflectionUtil 

    /**
     * 调用示例
     * public ApiResponse<String> test() throws Exception 
     *         Class[] argsType=new Class[]Class.forName("java.lang.String");
     *         Object[] args=new Object[]"hello";
     *         ReflectionUtil.invokeMethod(new ReportImpl(),"Test",argsType,args);
     *         return new ApiResponse().Success("str");
     *     
     * @param owner     类的实例
     * @param methodName    方法名
     * @param argsClass     参数类型
     * @param args          参数
     * @return
     * @throws Exception
     */

    public static Object invokeMethod(Object owner,String methodName,Class[] argsClass,Object[] args) throws Exception
        Object objRtn=null;
        Class ownerClass = owner.getClass();
        Method method = ownerClass.getMethod(methodName, argsClass);
        objRtn = method.invoke(owner, args);
        return objRtn;
    

    public static Object getFiledValue(Object obj,String filedName)
        Object objValue=null;
        try 
            Field field = obj.getClass().getDeclaredField(filedName);
            field.setAccessible(true);
            objValue = field.get(obj);
         catch (NoSuchFieldException e) 
            e.printStackTrace();
         catch (IllegalAccessException e) 
            e.printStackTrace();
        
        finally 
            return objValue;
        
    

    /**
     * Lambda 动态 Filter
     * @param list  数据
     * @param map   过滤字段/过滤值
     * @param <T>
     * @return
     */
    public static <T> List<T> getDataListFilter(List<T> list, Map<String, Object> map) 
        Supplier<Stream<T>> st = () -> list.stream();
        for (Map.Entry<String, Object> item : map.entrySet()) 
            Supplier<Stream<T>> stFilter = st;
            st = () -> stFilter.get().filter(x -> ReflectionUtil.getFiledValue(x, item.getKey()) == item.getValue());
        
        List<T> rList = st.get().collect(Collectors.toList());
        return rList;
    

    /**
     * Lambda 动态 Group
     * @param list  数据
     * @param groups    聚合字段
     * @param <T>
     * @return
     */
    public static  <T> Map<String, List<T>> getDataListGroup(List<T> list,List<String> groups)
        Map<String, List<T>> map= list.stream().collect(Collectors.groupingBy(x -> 
            String groupItem ="";
            for (String y : groups)
                groupItem+=ReflectionUtil.getFiledValue(x, y)+"_";
            
            return groupItem;
        ));
        return map;
    


二,测试:

@Test
    public void test() throws NoSuchFieldException, IllegalAccessException 
//filter 条件
        Map<String, Object> map = new HashMap<>();
        map.put("fileType", 1);
        map.put("reportName", "b");
//原数据
        List<FileTypeVO> list = new ArrayList<>() 
            
                add(new FileTypeVO(1, "a", "aPath"));
                add(new FileTypeVO(1, "b", "bPath"));
                add(new FileTypeVO(1, "b", "cPath"));
                add(new FileTypeVO(4, "c", "dPath"));
            
        ;
//group 字段
        List<String> groups=new ArrayList<>()
            add("reportName");
            add("filePath");
        ;

//filter 数据
        List<FileTypeVO> rList = ReflectionUtil.getDataListFilter(list, map);
//group 数据
        Map<String,List<FileTypeVO>> rMap=ReflectionUtil.getDataListGroup(rList,groups);
        System.out.println(rList.size());

    

测试实体:FileTypeVo

package com.leadtrans.report.model;

import io.swagger.annotations.ApiModelProperty;

/**
 * @author: Tyler
 * @createDate: 2021/11/17
 */


public class FileTypeVO 
    private int fileType;
    private String reportName;
    private String filePath;
    private String order;

    public FileTypeVO()
    public FileTypeVO(int fileType,String reportName,String filePath)
        this.fileType=fileType;
        this.reportName=reportName;
        this.filePath=filePath;
    

    public FileTypeVO(int fileType,String reportName,String filePath,String order)
        this(fileType,reportName,filePath);
        this.order=order;
    

    public int getFileType() 
        return fileType;
    

    public void setFileType(int fileType) 
        this.fileType = fileType;
    

    public String getFilePath() 
        return filePath;
    

    public void setFilePath(String filePath) 
        this.filePath = filePath;
    

    public String getReportName() 
        return reportName;
    

    public void setReportName(String reportName) 
        this.reportName = reportName;
    

    public String getOrder() 
        return order;
    

    public void setOrder(String order) 
        this.order = order;
    

以上是关于java 动态 lambda的主要内容,如果未能解决你的问题,请参考以下文章

Android开发太难了:Java Lambda ≠ Android Lambda (上)

Android开发太难了:Java Lambda ≠ Android Lambda (上)

Android开发太难了:Java Lambda ≠ Android Lambda (上)

java 动态 Lambda

java 动态 Lambda

JAVA由一个将JSONArray转成Map的需求引发的lambda语法的学习