Отображение на несколько карт параллельно с потоками Java 8

JAX-RS поддерживает стандартные / пользовательские HTTP-коды. См. ResponseBuilder и ResponseStatus, например:

http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/core/Response.ResponseBuilder.html# status% 28javax.ws.rs.core.Response.Status% 29

Имейте в виду, что информация JSON больше связана с данными, связанными с ресурсом / приложением. Коды HTTP больше относятся к статусу запрашиваемой операции CRUD. (по крайней мере, так оно и должно быть в системах REST-ful)

0
задан Aomine 13 July 2018 в 19:39
поделиться

2 ответа

Если у вас есть только Iterator (в отличие от Iterable или Spliterator ), это, вероятно, не стоит распараллеливать. В Эффективная Java Джош Блох утверждает, что:

Даже в лучших обстоятельствах распараллеливание конвейера вряд ли увеличит его производительность, если источник из Stream.iterate или используется промежуточная операция limit.

У Iterator есть только метод next, который (как правило) должен вызываться последовательно. Таким образом, любая попытка распараллеливания будет делать то, что делает Stream.iterate: последовательно запускает поток, а затем отправляет данные другим потокам. Есть много накладных расходов, которые поставляются с этой передачей, и кеш не на вашей стороне вообще. Есть хороший шанс, что это не будет стоить того, за исключением, может быть, если у вас есть несколько элементов для перебора, и у вас будет много работы над каждым. В этом случае вы можете также поместить их все в ArrayList и распараллеливаться оттуда.


Это другая история, если вы можете получить разумно параллелизуемый Stream . Вы можете получить их, если у вас хорошие Iterable или Spliterator. Если у вас есть хороший Spliterator, вы можете получить Stream с помощью методов StreamSupport.stream . Любой Iterable имеет метод spliterator . Если у вас есть Collection, используйте метод parallelStream .

A Map в Java имеет пары ключ-значение, поэтому я не совсем уверен, что вы означает «помещать в HashMap». Для этого ответа я предполагаю, что вы имеете в виду, что вы делаете вызов метода put, где ключ является одним из элементов и значением Boolean.TRUE. Если вы обновите свой вопрос, я могу дать более конкретный ответ.

В этом случае ваш код может выглядеть примерно так:

public static <E> Map<E, Boolean> putInMap(Stream<E> elements) {
  return elements.parallel()
      .collect(Collectors.toConcurrentMap(e -> e, e -> Boolean.TRUE, (a, b) -> Boolean.TRUE));
}
  • e -> e is ключ-ключ, создающий его так, чтобы клавишами были элементы.
  • e -> Boolean.TRUE является преобразователем значений, поэтому его значения равны true.
  • (a, b) -> Boolean.TRUE - это функция слияния, решая, как объединить два элемента в один.
0
ответ дан Finn Voichick 17 August 2018 в 12:12
поделиться
  • 1
    «Если у вас есть только Iterator (не Spliterator), то это, вероятно, не стоит распараллеливать. & quot; Любопытно рассуждать об этом. – SS' 15 July 2018 в 22:52
  • 2
    @SS 'обновляется с рассуждениями. – Finn Voichick 17 July 2018 в 12:18

Параллельные потоки, собранные в Collectors.toMap , уже будут обрабатывать поток по нескольким потокам, а затем объединить на потоковые карты в качестве последнего шага. Или в случае toConcurrentMap несколько потоков будут обрабатывать поток и объединять данные в поточно-безопасную карту.

0
ответ дан the8472 17 August 2018 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: