java函数式接口-按需返回

本文介绍如何在Java中自定义一个函数接口,用于按需返回数据。通过传入对象、自定义返回字段和对象内字段,实现动态获取和设置返回值。文章分为四个部分:概述、自定义函数接口的定义、工具方法的实现,以及单元测试的展示。

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

一、概述

需求:自定义一个按需返回的接口,可以传入{返回对象},{自定义返回字段},{对象内返回字段},来返回需要的数据。

  //user类:Long id;String name;
   User user1 = new User(1L,"唐僧");
   JsonUtils.Object2Map(
         user1
         //这里的m和entity是参数声明,在方法内部m为返回的map,entity为user1。
         ,(m, entity) -> {
   
            //m.put("test","110"); 为传入的逻辑
            m.put("test","110");
         }
         ,User::getName);
  • 思路:

    1. 需要一个R apply(T t)函数,传入对象和调用方法,返回调用方法的值
    2. 需要一个自定义函数方法 set,可以将数据返回后,自定义数据,这个自定义函数的参数为 map,传入对象T
  • 逻辑:

    1. 新建一个map作为返回对象
    2. 遍历传入的 调用方法函数,可以获取到调用方法 -->对应字段(getName–>name)
    3. 根据传入对象 t,调用apply方法,得到对应方法返回值 value
    4. map.put(name,value),装载对象
    5. 拿到自定义函数set,如果set !=null,则将 map和t作为参数(这里就将调用的时候map和返回的map联系起来了),调用set(而set方法的逻辑是由调用的时候指定的,所以需要在调用此方法的时候,传入自定义返回值(即传入逻辑))

二、自定义函数接口

package com.cuihq.testdemo.util;

import com.cuihq.testdemo.annotation.CommentTarget;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Optional;

//函数式接口注解
@FunctionalInterface
public interface SFunction<T,R> extends Serializable {
   
   /**
    * 函数接口方法,如User对象,利用user获取到其 id,name
    * 此种方法可以使用 User::getId
    * 其余需要传入 user::getId
    * @param t
    * @return
    */
   R apply(T t);


   /**
    * 获取SerializedLambda,如果传入User::getId 含有内容
    * implClass:接口实现类型 User
    * implMethodName:调用方法 getId
    *  implMethodSignature:方法属性返回值类型
    * @return SerializedLambda
    * @throws Exception
    */
   default SerializedLambda getSerializedLambda() throws Exception {
   
      //writeReplace改了好像会报异常
      Method write = this.getClass().getDeclaredMethod("writeReplace");
      write.setAccessible(true);
      return (SerializedLambda) write.invoke(this)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值