Можно ли выполнять другой процесс внутри метода фильтра в java 8 потоках? - PullRequest
0 голосов
/ 19 февраля 2020

Я знаю, как отфильтровать коллекцию по условию и собрать. Мне интересно, можно ли выполнять другой процесс внутри фильтра.

List<SupplementaryCustomer> supplementaryCustomersWithMoreThan100Points = new ArrayList<>();
List<Customer> customersWithMoreThan100Points = customers
  .stream()
  .filter(c -> {
     boolean isOkay = c.getPoints() > 100;
     if(isOkay && (c.isSupplementaryCustomer())){
       SupplementaryCustomer.add(c);
     }
     return isOkay;
   })
  .collect(Collectors.toList()); 

Допустим, у объекта клиентов есть все типы клиентов. и мне нужно было получить дополнительных клиентов с более чем 100 баллами и клиентов с более чем 100 баллами. я делаю что-то подобное в моей кодовой базе. это нормально делать что-то подобное?

1 Ответ

1 голос
/ 19 февраля 2020

Потоки должны быть свободны от побочных эффектов, за исключением операций терминала, которые предназначены для побочных эффектов (foreach). То, что вы делаете, нарушает эту парадигму. Стоимость повторной потоковой передачи полученного списка с последующей фильтрацией по другим критериям для добавления в другой список незначительна, если в вашем списке нет миллионов элементов, и даже в этом случае я бы выступил против нарушения парадигм языка для получения небольшой производительности. boost.

List<Customer> customersWithMoreThan100Points = customers
  .stream()
  .filter(c -> c.getPoints() > 100)
  .collect(Collectors.toList()); 

List<SupplementaryCustomer> supplementaryCustomersWithMoreThan100Points = customersWithMoreThan100Points
    .stream()
    .filter(c -> c.isSupplementaryCustomer())
    .collect(Collectors.toList());

Его легче читать, он менее сложен, более соответствует целям Streams, и я сомневаюсь, что вы найдете заметную (или даже измеримую) потерю производительности в любом типичном случае использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...