Stream api filter

195
29 июня 2022, 08:50

Всем привет!) Столкнулась с проблемой... Моя небольшая голова все никак не может придумать, как можно отфильтровать один стрим одного типа по другому другого типа. Если конкретнее, то - я пишу симулятор лифта, один Stream у меня Integer, второй Passenger. Stream<Integer> представляет из себя последовательность заявок. Мне нужно отфильтровать этот стрим так, чтобы к пассажирам, которые уже вошли в кабину(boolean isEntered), лифт не ехал, но если уж он их забрал, то необходимо доехать до этажа конечной остановки. Тоесть, from откинуть, а to оставить. Что-то типа такого:

stations = stations.stream().filter(station -> passengers.stream().flatMap(p -> Stream.of((if !p.isEtered)p.getDepature, (and required)p.getDestination)));

Как-то так. Криво конечно, но совсем не знаю как это можно провернуть. Помогите, пожалуйста :3

Answer 1

Насколько я понимаю, вам нужно что-то такое

Set<Integer> stops = Stream.concat(
    passengers.stream().filter(x -> !x.isEntered()).map(Passenger::getDeparture),
    passengers.stream().map(Passenger::getDestination)
).collect(Collectors.toSet());
Stream<Integer> result = stations.stream().filter(stops::contains);
Answer 2

Думаю что-нибудь такое. Накидал так как представил по вашему разъяснению задачу.

class App {
  public static void main(String[] args) {
    List<Integer> stations = Arrays.asList(1, 2, 3, 4, 5);
    App outer = new App();
    List<Passenger> passengers = new ArrayList<>();
    passengers.add(outer.new Passenger(1));
    passengers.add(outer.new Passenger(2));
    passengers.add(outer.new Passenger(3));
    passengers.add(outer.new Passenger(4));
    System.out.println(passengers);
    List<Integer> newStations =
        stations.stream()
            .filter(
                station ->
                    passengers.stream().anyMatch(p -> !p.isEntered() && p.departure == station))
            .collect(Collectors.toList());
    System.out.println(newStations);
  }
  public class Passenger {
    private Integer number;
    private Integer departure;
    private Integer destination;
    private Boolean entered;
    public Passenger(Integer number) {
      this.departure = (int) (Math.random() * 5) + 1;
      this.destination = (int) (Math.random() * 5) + 1;
      this.entered = false;
      this.number = number;
    }
    public Integer getDepature() {
      return this.departure;
    }
    public Integer getDestination() {
      return this.destination;
    }
    public Boolean isEntered() {
      return entered;
    }
    public void setEntered(Boolean entered) {
      this.entered = entered;
    }
    public Integer getNumber() {
      return number;
    }
    public void setNumber(Integer number) {
      this.number = number;
    }
    public String toString() {
      return "number = "
          + this.number
          + " departure = "
          + this.departure
          + " destination = "
          + this.destination
          + " entered = "
          + this.entered;
    }
  }
}
READ ALSO
Организация тестов в многомодульном проекте

Организация тестов в многомодульном проекте

Доброго времени)) Имеется модуль AВ нем в тестовых директориях лежат тестовые сущности (не тесты)

148
Какой Сервер выбрать для Java

Какой Сервер выбрать для Java

Пытаюсь изучать разработку web приложений на JavaПопробовал TomCat, с ним проблем не возникло, вот только это не полноценный сервер, а хотелось...

339
java.lang.IllegalArgumentException: argument &quot;content&quot; is null

java.lang.IllegalArgumentException: argument "content" is null

Выпрыгивает ошибка javalang

428
Группировка даних CSV file Java Console Application

Группировка даних CSV file Java Console Application

Есть CSV file с даними и разделителем кома между столбцамиCsv file прикреплен ниже Нужно по группировать эти данные и сгенерировать новый CSV file в таком...

250