Java中可接收两种不同类型列表的迭代取值方法能否合并为一个?
问题解答
完全可以合并为通用方法,以下是两种常用的落地实现方案:
方案1:使用函数式接口做属性提取(无侵入,无需修改原有实体类)
Java 8及以上版本可以直接用Function做属性提取,不需要改动现有Student、Teacher类的代码,是优先推荐的方案:
通用方法定义
import java.util.List; import java.util.function.Function; public class ListUtils { // 泛型T匹配任意列表元素类型,valueGetter参数负责提取对应类的目标判断值 public static <T> int findMatchValue(List<T> list, Function<T, Integer> valueGetter) { for (T item : list) { int current = valueGetter.apply(item); if (current == -1) { return current; } } // 此处可根据业务需求调整未命中时的返回值 return 0; } }
调用示例
- 遍历
List<Student>:ListUtils.findMatchValue(studentList, Student::value) - 遍历
List<Teacher>:ListUtils.findMatchValue(teacherList, Teacher::val)
如果原有Teacher类的逻辑是用val()做判断、value()做返回,只要调整传入的Function逻辑即可:teacher -> teacher.val() == -1 ? teacher.value() : teacher.val()
方案2:统一实现公共接口(适合可修改原有实体类的场景)
如果有权限调整Student和Teacher的类定义,可以通过公共接口统一取值逻辑:
1. 定义公共取值接口
public interface ValueAccessible { int getTargetValue(); }
2. 两个实体类分别实现接口
Student类实现:
@Override public int getTargetValue() { // 原有取值方法 return this.value(); }
Teacher类实现:
@Override public int getTargetValue() { // 原有取值方法,和Student对齐返回逻辑即可 return this.val(); }
3. 通用方法定义
public static int findMatchValue(List<? extends ValueAccessible> list) { for (ValueAccessible item : list) { int current = item.getTargetValue(); if (current == -1) { return current; } } // 自定义未命中返回逻辑 return 0; }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

