Примитивные потоки Java 8 для методов отображения коллекций - PullRequest
0 голосов
/ 31 декабря 2018

Есть ли существенная разница (в производительности или лучших методах) между этими двумя методами создания потока?

int[] arr2 = {1,2,3,4,5,6};

Arrays.stream(arr2)
      .map((in)->in*2)
      .mapToObj((in) -> new Integer(in))
      .collect(Collectors.toCollection(()-> new ArrayList<>()));

Arrays.stream(arr2)
      .map(in->in*2)
      .boxed()
      .collect(Collectors.toCollection(()-> new ArrayList<>()));

РЕДАКТИРОВАТЬ

Благодаря ответам сообщества Stack я могу добавить некоторые дополнения к вопросуПолнота для новых читателей:

Как уже отмечалось, .boxed() Метод IntStream определяется как:

@Override
    public final Stream<Integer> boxed() {
        return mapToObj(Integer::valueOf);
    }

Что в основном переопределяет проблему, для которой одно из следующих лучше:

.mapToObj(in -> new Integer(in))

или

.mapToObj(in -> Integer.valueOf(in))

Ответы [ 6 ]

0 голосов
/ 31 декабря 2018

Как для производительности, так и для лучших практик, мы должны выбрать boxed() вместо mapToObj((in) -> new Integer(in)).


Производительность:

См. Ниже boxed() исходный код (в абстрактном классе IntPipeline<E_IN>, который реализует IntStream, в package java.util.stream):

@Override
    public final Stream<Integer> boxed() {
        return mapToObj(Integer::valueOf);
    }

Итак, он звонит mapToObj() с Integer::valueOf.Обратите внимание, что при повторном использовании кэшированных значений Integer::valueOf более эффективен, чем new Integer(), поэтому мы должны выбрать boxed().


Наилучшая практика:

Помимо разницы в производительности, с boxed() мы пишем меньше, и его легче читать.

0 голосов
/ 31 декабря 2018

IntStream.boxed() использует Integer.valueOf(int), что является оптимизированной версией * Integer(int).

Внутренне, boxed()определяется как mapToObj(Integer::valueOf).


* этот метод обычно следует использовать вместо конструктора Integer(int), так как этот метод, вероятно, даст значительно лучшепространственно-временная производительность путем кэширования часто запрашиваемых значений.

Javadoc Integer.valueOf(int)

0 голосов
/ 31 декабря 2018

С точки зрения наилучшей практики, второй подход предпочтительнее, потому что, когда вы хотите поместить в коробку примитивное значение, boxed создается именно для этой цели и делает это наиболее оптимизированным способом, тогда как mapToObj, хотя может использоватьсячтобы достигнуть того же самого, это не идиоматический подход.

Кроме того, рекомендуется больше не использовать конструкторы типа примитивной оболочки, а вместо этого отдавать предпочтение методам valueOf, потому что эти конструкторы также устареликак тот факт, что использование valueOf уменьшает объем памяти по сравнению с конструкторами, что ведет к повышению производительности.

0 голосов
/ 31 декабря 2018

Да, boxed() использует Integer.valueOf, который может извлечь несколько Integer экземпляров из кэша .

Таким образом, вы должны либо использовать версию с boxed() (предпочтительно), либо использовать Integer.valueOf вместо new Integer().Обратите внимание, что boxed() на самом деле является сокращением для mapToObj(Integer::valueOf).

0 голосов
/ 31 декабря 2018

Второй будет эффективно использовать целочисленный кеш jvm, поэтому он будет лучше как по производительности, так и по лучшей практике (не создавайте экземпляры в штучной упаковке, лучше пусть vm сделает это за вас).

Вы могли бы имитировать то же поведение, если бы вы изменили new Integer(in) с Integer.valueOf(in)

0 голосов
/ 31 декабря 2018

Второй вариант лучше, так как в этом примере он не создает Integer объектов.

Из JLS 5.1.7

Если значение pбыть в боксе - это ... int ... между -128 и 127 (включительно), тогда пусть r1 и r2 будут результатами любых двух преобразований бокса p.Это всегда тот случай, когда r1 == r2.

Вообще говоря, вам не следует вызывать new для типов оболочек, а использовать их static фабричные методы - например, Integer.valueOf

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