Java (8): Как извлечь конкретный элемент класса из массива объектов? - PullRequest
4 голосов
/ 22 мая 2019

Мне нужно работать с массивом Objects, который имеет следующее значение:

objectsArray = {Object[3]@10910} 
 {Class@10294} "class com.ApplicationConfiguration" -> {ApplicationConfiguration@10958} 
    key = {Class@10294} "class com.ApplicationConfiguration"
    value = {ApplicationConfiguration@10958} 
 {Class@10837} "class com.JoongaContextData" -> {JoongaContextData@10960} 
    key = {Class@10837} "class com.JoongaContextData"
    value = {JoongaContextData@10960} 
 {Class@10835} "class com.SecurityContext" -> {SecurityContext@10961} 
    key = {Class@10835} "class com.SecurityContext"
    value = {SecurityContext@10961} 

Код, который создает массив объектов:

public class ProcessDetails {
    private UUID myId;
    private Date startTime;
    private ResultDetails resultDetails;
    private long timeout;
    .
    .
    .
}

public interface ProcessStore extends Map<Class, Object> {
    <T> T unmarshalling(Class<T> var1);

    <T> void marshalling(T var1);

    ProcessDetails getProcessDetails();
}

Object[] objectsArray = processStore.entrySet().toArray();

Мне нужно извлечь значениеиз элемента типа ApplicationConfiguration .

Обратите внимание, что это не всегда первый элемент массива!

Для начала я попытался сделать следующее:

    List<ApplicationConfiguration> ApplicationConfigurations = Arrays.stream(objectsArray)
            .filter(item -> item instanceof ApplicationConfiguration)
            .map(item -> (ApplicationConfiguration)item)
            .collect(Collectors.toList());

, чтобы получить список с конкретным предметом.По какой-то причине у меня есть пустой список.

Может кто-нибудь сказать, пожалуйста, почему?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 мая 2019

objectsArray содержит записи карты, и вам необходимо отфильтровать значения этих записей.

List<ApplicationConfiguration> ApplicationConfigurations = 
    Arrays.stream(objectsArray)
          .map(obj -> (Map.Entry<Class, Object>) obj)
          .map(Map.Entry::getValue)
          .filter(item -> item instanceof ApplicationConfiguration)
          .map(item -> (ApplicationConfiguration)item)
          .collect(Collectors.toList());

Конечно, было бы чище, если вы изменили

 Object[] objectsArray = processStore.entrySet().toArray();

на

 Map.EntryMap.Entry<Class,Object>[] objectsArray = processStore.entrySet().toArray(new Map.Entry[0]);

так что вы можете написать:

List<ApplicationConfiguration> ApplicationConfigurations = 
    Arrays.stream(objectsArray)
          .filter(e -> e.getValue() instanceof ApplicationConfiguration)
          .map(e -> (ApplicationConfiguration) e.getValue())
          .collect(Collectors.toList());
3 голосов
/ 22 мая 2019

Вы пытаетесь найти экземпляры ApplicationConfiguration напрямую в массиве типа Map.Entry<K,V>[], созданном с помощью Map#entrySet(), и последующем вызове Set#toArray().

Вместо этого попробуйте это:

List<ApplicationConfiguration> boxes = Arrays.stream(objectsArray)
            .map(entry -> ((Map.Entry<Class<?>, Object>) entry))
            .filter(entry -> entry.getKey().isAssignableFrom(ApplicationConfiguration.class))
            .map(Map.Entry::getValue)
            .map(v -> (ApplicationConfiguration) v)
            .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...