Необязательный Java, содержащий массив - PullRequest
0 голосов
/ 12 мая 2018

Во всех поисках, которые я делал, я не мог найти пример такого рода. Мой плохой: (* ​​1001 *

У меня есть дополнительный объект, содержащий массив. Теперь мне нужно пройти массив и найти внутри него определенный элемент.

Коды и примеры классов следующие:

public class Component {
   private String name;

   public Component(String ipName) {
      this.name = ipName;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

public class Container {
   private Component[] componentArray;

   public Container(Component[] ipComponentArray) {
      this.componentArray = ipComponentArray;
   }

   public Component[] getComponentArray() {
      return componentArray;
   }

   public void setComponentArray(Component[] componentArray) {
      this.componentArray = componentArray;
   }
}

public class TestClass {
   public static void main(String[] args) {
      Container newContainer = getNewContainer();
      System.out.println(checkIfComponentIsPresent("Two", newContainer)); //prints true
      System.out.println(checkIfComponentIsPresent("Five", newContainer)); //prints false
   }

   private static Container getNewContainer() {
      return new Container(new Component[] {new Component("One"), new Component("Two"), new Component("Three")});
   }

   private static boolean checkIfComponentIsPresent(String ipName, Container newContainer) {
      boolean isPresent = false;

      Optional<Component[]> componentArrayOptional = Optional.ofNullable(newContainer).map(Container::getComponentArray);
      if(componentArrayOptional.isPresent()) {
          Component[] componentArray = componentArrayOptional.get();
          if(componentArray != null && componentArray.length > 0) {
              for(Component component : componentArray) {
                  if(ipName.equals(component.getName())) {
                     isPresent = true;
                     break;
                  }
              }
          }
      }

      return isPresent;
   }
}

Может кто-нибудь посоветовать, пожалуйста, как мне улучшить метод checkIfComponentIsPresent? Я хочу знать, как мы можем пройти массив внутри необязательного объекта, не преобразовывая его в список или поток.

Я могу сделать это используя потоки следующим образом:

private static boolean checkIfComponentIsPresentUsingStreams(String ipName, Container newContainer) {
    boolean isPresent = false;

    Optional<Component[]> componentArrayOptional = Optional.ofNullable(newContainer).map(Container::getComponentArray);
    if(componentArrayOptional.isPresent()) {
        Stream<Component> componentArrayStream =  Arrays.stream(componentArrayOptional.get());
        isPresent = componentArrayStream.filter(component -> ipName.equals(component.getName())).findFirst().isPresent();
    }

    return isPresent;
}

Но я не могу использовать потоки, на самом деле мои классы огромны, а сам массив может содержать множество элементов. Использование потоков ухудшит производительность.

Спасибо!

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете работать с фактическим значением объекта внутри map, метод:

boolean isPresent = Optional.ofNullable(newContainer)
  .map(Container::getComponentArray)
  .map(arr -> {
    for (Component component : arr) {
      if (Objects.equals(component.getName(), ipName)) {
        return true;
      }
    }
    return false;
  })
  .orElse(false);

На самом деле я уверен, что заставляет вас думать, что Stream значительно замедлит ваше приложение. И поэтому есть другое решение, использующее потоки:

boolean isPresent = Optional.ofNullable(newContainer)
  .map(Container::getComponentArray)
  .map(arr -> Stream.of(arr).anyMatch(component -> Objects.equals(ipName, component.getName())))
  .orElse(false);
...