Java 中,集合里使用了泛型,如何将两个只有泛型不同的方法提取成为一个方法。

这是一只小小鸟 发布于 09/11 13:55
阅读 389
收藏 0

解读下一代网络:算力网络正从理想照进现实!>>>

Java 中,集合里使用了泛型,如何将两个只有泛型不同的方法提取成为一个方法。

加载中
2
梦里蓝天
梦里蓝天

https://blog.csdn.net/ren365880/article/details/108538066

不知道这是不是你想要的

1
zjg23
zjg23

//您看下method3是不是满足要求?

public class TestFanxing {
	
	public void method1(List<A> list,String id) {
		for(Parent item:list) {
			method1(list,item.getId());
		}
	}
	
	public void method2(List<B> list,String id) {
		for(B item:list) {
			method2(list,item.getId());
		}
	}
	
	public void method3(List< ? extends Parent> list,String id) {
		for(Parent item:list) {
			method3(list,item.getId());
		}
	}

	public static void main(String[] args) {
		List<B> list = new ArrayList<>();
		String id="1";
		new TestFanxing().method3(list,id);

	}

}


public class Parent {

	String id;

	public Parent() {
		super();
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

}

public class A extends Parent {
	
}

public class B  extends Parent {
	
	
}

 

1
chentao106
chentao106
最简单的方法是用函数接口 public <T> List<Map<String, Object>> dataNode(List<T> list, String parentId, Function parentIdGetter, Function idGetter) 代码里面的map.getId()用idGetter.apply(map代替),parentId类似 使用:dataNode(list, parentId, (map)->map.getParentId(),(map)->map.getId()); 如果java8以下,用接口定义两个取id方法,两个实体类实现接口(假如接口为IDable),方法体具体类改用接口,方法签名改下就好: public <T extends IDable> List<Map<String, Object>> dataNode(List<T> list, String parentId) 你好歹贴源码,我可以复制编辑,手机打字累死我了…
这是一只小小鸟
这是一只小小鸟
辛苦啦,给大佬点个赞
0
这是一只小小鸟
这是一只小小鸟

现在有点忙,能摸鱼的时间不是很多了,看了大佬们的回答,能够解决的办法都是类似的。提供一个父类,由父类提供需要执行的属性,这个方法也挺好的,一般创建bean的话,id这种共工的属性应该提取。我这里,使用的 代码自动生成,偷懒没有写 bean 的映射文件,id都是独立存在的,就得对原有的代码进行改造,不太理想。

 

三楼提到的 方法 很不错,有一个问题 map -> {map.getId()} 这个操作,直接这么写的话,是会报错的,入参的List 也不能提供泛型,提供了的话,其他泛型的入参就不行了。这里我想了一个折中的办法,使用 方法的引用 TaskInfo::getId 这种操作。这又有限制,要么把getId 改成 静态的,要么使用 对象,开始我要使用的对象在方法里面呢也不行。

最后 我使用反射来解决的这个问题。代码如下

public List<Map<String, Object>> dataNodeRefelct(List list, String parentId, MyFunction my, Class clazz) throws Exception {
  List<Map<String, Object>> tree = new ArrayList<>();
    for (Object map: list) {
      if (parentId.equals(my.reflect(clazz,map,"getId"))) {
      Map<String, Object> treeMap = new HashMap();
      treeMap.putAll(BeanMap.create(map));
      treeMap.put("children", dataNodeRefelct(list,my.reflect(clazz,map,"getParentId"),my,clazz));
      tree.add(treeMap);
      }
  }
  return tree;
}
import java.lang.reflect.Method;

public class MyFunction{

  public String reflect(Class clazz ,Object obj,String method) throws Exception{
    Method m = clazz.getMethod(method);
    return  String.valueOf(m.invoke(obj));
  }

}
0
返回顶部
顶部