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

Выполнение нескольких логик в потоке

Пробуем потоки Java 8. Возможно ли в потоках найти количество элементов, начинающихся с X , Y , Z из списка, который содержит много элементов.

transactions.stream()
            .filter(e -> startsWith("X"))
            .count();

transactions.stream()
            .filter(e -> startsWith("Y"))
            .count();

transactions.stream()
            .filter(e -> startsWith("Z"))
            .count();

Приведенный выше код дает количество элементов, начинающихся с X, Y, Z в списке, но в приведенном выше случае я трижды перебираю список, чтобы получить данные. Это можно сделать, повторив список только один раз, используя простой цикл for. Можно ли выполнить все эти условия в одном потоке [итерации только один раз] вместо использования нескольких потоков?

Любая помощь приветствуется.

24.05.2017

Ответы:


1

Я бы не стал использовать потоки для этого. Но если вам нужно, взгляните на этот код:

Map<String, Long> collect = transactions.stream().collect(Collectors.groupingBy(t -> {
    if (t.startsWith("X")) {
        return "X";
    }
    if (t.startsWith("Y")) {
        return "Y";
    }
    if (t.startsWith("Z")) {
        return "Z";
    }
    return "none";
}, Collectors.counting()));

напечатает что-то вроде

{X=1, Y=1, Z=1, none=1}

Для конкретного случая

24.05.2017
  • Я бы не стал использовать для этого потоки, но это то, что используете вы! 24.05.2017
  • Я просто отмечу, что если критерий всегда является первым символом, было бы намного проще вернуть t.charAt(0) в качестве классификатора. 24.05.2017
  • @АлексисС. потому что это был вопрос. Вот почему я написал [Но] Если вы должны... 24.05.2017
  • @JornVernee Верно. Но это уже не множественная логика ;) 24.05.2017
  • @steffen Спасибо за помощь. 24.05.2017
  • Почему бы и нет? Это типичная операция группировки/сокращения, и я думаю, что это задача, которая идеально подходит для потокового API, как показывает ваш ответ. 24.05.2017
  • @АлексисС. Ограниченная расширяемость (только для подсчета), требуется промежуточная карта, плюс обычные вещи, такие как ужасные трассировки стека, менее интуитивно отлаживаемые и т. д. 24.05.2017

  • 2

    Как насчет этого, он мог найти все типы первой буквы.

    Map<String, Long> collect = transactions.stream()
                                            .collect(Collectors.groupingBy(s -> s.substring(0, 1), Collectors.counting()))
    

    Не только «X», «Y», «Z», но также «a», «c» или любую первую букву элемента, который вы даете.

    Наконец, вы можете использовать метод get, чтобы получить то, что хотите, как показано ниже:

    collect.get("X");
    collect.get("Y");
    collect.get("Z");
    
    25.05.2017
    Новые материалы

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

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

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

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

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

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

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