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

Уменьшить, если в потоке Java

Как я могу применить операцию сокращения только в том случае, если предикат истинен?

Например:

        Stream.of("foo=X","bar=Y","foo=Z")
        .reduce((arg1, arg2)-> arg1.contains(arg2) ? arg1  : <reduceNothing>)
        .collect(Collectors.toList());

Я хочу избавиться от одного из "foo=...", чтобы в конце был список "foo=X","bar=Y"


  • не могли бы вы добавить args контент, пожалуйста? 03.10.2018
  • как насчет конкретного примера? скажем, у вас есть List<List<Integer>>... 03.10.2018
  • кроме того, reduce должен все время возвращать новый экземпляр, так что просто ? arg1 все равно неверно; Пожалуйста, укажите, что вы на самом деле хотите сделать 03.10.2018
  • reduce возвращает одно значение. Какой результат вы ожидаете? 03.10.2018
  • вы уверены, что это правильное редактирование? Я думаю, нам все еще нужны подробности, например, каков ожидаемый результат? 03.10.2018
  • вы можете добавить фильтр перед частью сокращения в вашем примере кода. 03.10.2018
  • и, конечно же, reduce и после collect = двух терминальных операций... голосование за закрытие пока неясно; может быть предоставить некоторые четкие детали 03.10.2018
  • @Eugene говорит ожидаемый результат 03.10.2018
  • позвольте мне понять это прямо: вы имеете в виду, что если вы уже видели foo раньше, игнорировать текущее сопоставление, где находится foo, и так далее? Или, проще говоря, вы хотите избавиться от дубликатов, где присутствует какая-то часть строки? например: "foo=X","bar=Y","foo=Z", "bar=M", "test=12", "test=45", ваш результат будет: "foo=X","bar=Y", "test=12"? 03.10.2018
  • @Евгений да точно!!! 03.10.2018
  • @ Юджин, я тщательно проверю ответы. Когда закончу, приму тот, который решит мою проблему наилучшим образом 03.10.2018

Ответы:


1

Вот способ сделать это (без потоков):

Map<String, String> map = new LinkedHashMap<>();

yourListOfArgs.forEach(arg -> map.merge(arg.split("=")[0], arg, (o, n) -> o));

Collection<String> uniqueArgs = map.values();
03.10.2018

2

Просто используйте слияние, которое даст первый (в порядке встречи) результат в случае обнаружения дубликата:

Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
            .collect(Collectors.toMap(
                    x -> x.split("=")[0],
                    Function.identity(),
                    (left, right) -> left,
                    LinkedHashMap::new))
            .values();

    System.out.println(result); // [foo=X, bar=Y, test=12]

Я использовал LinkedHashMap на случай, если вам нужно сохранить первоначальный порядок, если вам это не нужно, просто используйте:

 Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
            .collect(Collectors.toMap(
                    x -> x.split("=")[0],
                    Function.identity(),
                    (left, right) -> left))
            .values();

  System.out.println(result); // [bar=Y, test=12, foo=X]
03.10.2018

3

Попробуй это:

Stream.of("foo=X","bar=Y","foo=Z")
            .collect(Collectors.toMap(
                    x -> getLeftSide(x),
                    x -> x,
                    (x, y) -> x
            ))
            .values();

Я предполагаю, что у вас есть метод getLeftSide, который возвращает левую часть присваивания (преобразование "foo=bar" в "foo").

03.10.2018

4

Если есть возможность использовать любую другую операцию, кроме сокращения, то ответом может быть следующее:

@Test
public void test(){
    System.out.println(methodContainingFilteringLogic(word -> word.equals("foo=Z"),
            Stream.of("foo=X","bar=Y","foo=Z")));
}

public static List<String> methodContainingFilteringLogic(Predicate<String> predicate, Stream<String> wordsStream) {
    return wordsStream.filter(word -> predicate.negate().test(word))
            .collect(Collectors.toList());
}

В вашем случае было бы известно, на каком основании следует фильтровать данный поток. В этот момент можно было вызвать methodContainingFilteringLogic.

03.10.2018
  • с этим решением мне нужно жестко закодировать "foo=Z", так что это недействительно, так как я не буду знать значение Z, и если я поставлю "foo=Z", все "foo=..." будут удалены 03.10.2018
  • Жесткое кодирование можно исключить, передав Predicate в качестве аргумента. 03.10.2018
  • ответ обновлен. Я не уверен, что это то, что вы искали. 04.10.2018
  • Новые материалы

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

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

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

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

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

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

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