Вы можете создать interface DeviceValueExtractor
, который выглядит следующим образом:
@FunctionalInterface
public interface DeviceValueExtractor {
Object extractValue(Device device);
}
Теперь переписайте ваш метод следующим образом:
public void filterByType(Device[] devices, DeviceValueExtractor extractor, Object expect) {
if (devices == null) {
return;
}
for (int i = 0; i < devices.length; i++) {
if (devices[i] == null) {
continue;
}
Object actual = extractor.extractValue(devices[i]);
if (actual == null && expect== null) {
continue;
} else if (actual == null) {
devices[i] = null;
continue;
}
if (!Objects.equals(actual, expect)) {
devices[i] = null;
}
}
}
Использование:
filterByType(devices, Device::getType, "Hello");
Примечание: Я использовал Object
из-за требования не иметь дженериков - потому что единственный вызванный метод - equals
, это фактически не большая сделка.
Однако для большей безопасности типов вы можете ввести дженерики (и покончить с DeviceValueExtractor
:
public static <T> void filterByType(Device[] devices, Function<Device, T> extractor, T expect) {
if (devices == null) {
return;
}
for (int i = 0; i < devices.length; i++) {
if (devices[i] == null) {
continue;
}
Object actual = extractor.apply(devices[i]);
if (actual == null && expect== null) {
continue;
} else if (actual == null) {
devices[i] = null;
continue;
}
if (!Objects.equals(actual, expect)) {
devices[i] = null;
}
}
}