Фильтр потока массива Java 8

#java #filter #java-8 #java-stream

#java #Фильтр #java-8 #java-stream

Вопрос:

У меня есть один простой массив с пользовательским объектом, и я хочу фильтровать с помощью потока java 8.

     A[] aArray = new A[3];

    A a1 = new A();
    a1.setaId(1);
    a1.setaName("AName1");

    B b1 = new B();
    b1.setbId(1);
    b1.setbName("BName1");

    a1.setB(b1);
    aArray[0] = a1;

    A a2 = new A();
    a2.setaId(2);
    a2.setaName("AName2");

    B b2 = new B();
    b2.setbId(2);
    b2.setbName("BName2");

    a2.setB(b2);
    aArray[1] = a2;
  

Не могли бы вы, пожалуйста, подсказать, как я могу перейти к потоку фильтра в массиве, А НЕ В ArrayList

В принципе, я хочу фильтровать только со значением «BName2».

Комментарии:

1. Размер вашего массива должен быть 2. Таким образом, объявление должно быть изменено следующим образом: A[] aArray = new A[2];

2. В качестве отступления определите себе несколько хороших конструкторов, чтобы вы могли сделать просто A[] aArray = new A[] { new A(1, "AName1", new B(1, "BName1")), new A(2, "AName2", new B(2, "BName2")), null }; .

Ответ №1:

Если вы сохраняете уникальный элемент в массиве, вы можете использовать следующий подход

Если объект уникален

 A aWithValidString = Arrays.stream(aArray)
    .filter(a -> "BName2".equals(a.getB().getbName()))
    .finAny().orElse(null);
  

Если у вас есть несколько объектов в массиве со строкой «Bname2», вы можете использовать приведенный ниже код

 List<A> filteredObject = Arrays.stream(aArray)
    .filter(a -> "BName2".equals(a.getB().getbName()))
    .collect(Collectors.toList());
  

И список итераций

Комментарии:

1. Вызов Optional.get всегда является ошибкой.

2. @BoristheSpider исправлено, спасибо 🙂

3. .orElse(null) всегда вызывает у меня депрессию… С Optional зачем вы вообще хотите использовать null ? Вы можете просто вернуть Optional и все — нет смысла сопоставлять его с null