java mybatis 如何自己实现一下 Lambda。 如何把 Entity::getId 作为参数?

问题

需求

  • 我有一个实体 充血模型 Entity
  • 想要实现 fieldList ( 根据字段名获取list上的数据 )
class Entity {
  List list 
 
  //  根据字段名获取list上的数据
  public List fieldList () {} 
}

演示

Entity entity = new Entity();
List list = [{id:11, name:12}, {id:21, name: 22} , { id: 31, name:32}]
entity.setList(list);

// 第一种
entity.fieldList("id")  // [11,21,31]

// 第二种 如何实现
entity.fieldList(Entity::getId) //  [11,21,31]

现状

  • Entity.java

image.png

  • 实际使用 报错
    image.png
阅读 2.3k
2 个回答

你这个我在mybatisplus中见过,你可以看一下mybatisplus中的com.baomidou.mybatisplus.core.toolkit.LambdaUtils#extract

正常getId的lambda方法应该是java.util.function.Function的字类,
现在要改成com.baomidou.mybatisplus.core.toolkit.support.SFunction,这个实现了Serializable,这样会有隐藏的writeReplace方法,writeReplace里能拿到这个lambda对应方法的名称

这样你就能根据lambda方法获取字段名称。

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Entity {
    private List<Data> list;

    // getters and setters

    public <T> List<T> fieldList(Function<Data, T> function) {
        return list.stream().map(function).collect(Collectors.toList());
    }
}

然后用这个方法:

Entity entity = new Entity();
List<Data> list = Arrays.asList(new Data(11, "12"), new Data(21, "22"), new Data(31, "32"));
entity.setList(list);

List<Integer> ids = entity.fieldList(Data::getId);  // [11, 21, 31]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题