Nano Hash - криптовалюты, майнинг, программирование

Как правильно найти характеристики потока в Java-8?

При выполнении потоковых операций во время промежуточных/конвейерных операций потоки будут создаваться с разными характеристиками (например, СОРТИРОВКА/РАЗМЕР/ОТДЕЛЬНЫЕ/УПОРЯДОЧЕННЫЕ) – Освоение лямбда-выражений (гл. 6)

Stream.of(8,3,5,6,7,4) // ORDERED, SIZED
.filter(i->i%2==0) // ORDERED
.sorted() // ORDERED, SORTED
.distinct() // DISTINCT, ORDERED, SORTED
.map(i->i+1) // ORDERED
.unordered(); // none

Как узнать различные характеристики потока, упомянутые в приведенном выше фрагменте?

11.06.2017

Ответы:


1

Я хотел бы немного расширить то, что сказал assylias (что абсолютно правильно).

Во-первых, эти характеристики реализованы как простое int, это двоичное представление. Сначала это все нули, но когда вы добавляете определенную характеристику, ее бит устанавливается в one с помощью операции OR, удаляется с помощью операции AND.

Вы можете увидеть, где определенное свойство Spliterator устанавливает свой one, просто выполнив это, например:

System.out.println(Integer.toBinaryString(Spliterator.SIZED)); // 1000000

Это установка 7-го бита в один справа. Итак, когда вы проверяете:

Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();
System.out.println((spliterator.characteristics() & Spliterator.SIZED) == Spliterator.SIZED);

На самом деле вы проверяете, установлен ли этот особый бит.

Второй

Существует четыре характеристики потока, которые устанавливаются в результате создания первого потока (а не двух). Либо книга немного устарела, либо вы не показали нам весь пример:

Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();

System.out.println(Integer.bitCount(spliterator.characteristics())); // 4
System.out.println(Integer.toBinaryString(spliterator.characteristics()));// 100010001010000

Эти установленные биты (равные one) соответствуют SIZED, ORDERED, IMMUTABLE, SUBSIZED.

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

Третий

Эти характеристики чрезвычайно важны при потоковой обработке. Несколько примеров:

long howMany = Stream.of(1, 2, 3).map(x -> {
        System.out.println("mapping");
        return x * 2;
    }).count();
    System.out.println(howMany); // 3

В java-9 вы не увидите напечатанного mapping, потому что вы не изменили поток (вы не очистили характеристику SIZED); таким образом, нет необходимости даже оценивать сопоставление.

Stream<Integer> unlimited = Stream.iterate(0, x -> x + 1); 
System.out.println(unlimited.spliterator().hasCharacteristics(Spliterator.SIZED));
Stream<Integer> limited = unlimited.limit(3);          
System.out.println(limited.spliterator().hasCharacteristics(Spliterator.SIZED));

Вы могли бы подумать, что на выходе должно быть false true — в конце концов, мы добавляем limit, но нет; результат false false: такая оптимизация не выполняется, даже если ей мало что мешает.

11.06.2017
  • Нет, я дал весь фрагмент. Возможно у меня устаревшее издание книги. 12.06.2017
  • Третий пример (второй фрагмент), разве jdk9 не позаботится об этом ?? 12.06.2017

  • 2

    На каждом этапе вы можете позвонить:

    int c = stream.spliterator().characteristics();
    

    А затем проверьте результат на соответствие константам, определенным в классе Spliterator. Например, чтобы увидеть, упорядочен ли поток:

    boolean isOrdered = (c & Spliterator.ORDERED) == Spliterator.ORDERED;
    

    В качестве альтернативы вы можете использовать:

    boolean isOrdered = stream.spliterator().hasCharacteristics(Spliterator.ORDERED);
    
    11.06.2017
  • @Eugene: вы можете воссоздать поток из разделителя, см. здесь, я полагаю, это то, что нужно OP после… 12.06.2017
  • @ Хольгер ах! было бы разумно вернуть поток из этого сплиттера... спасибо. искренне поздравляю со 100к. 12.06.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..