Java Stream - String заменить, если совпадение с использованием Streams? - PullRequest
3 голосов
/ 17 января 2020

У меня есть условие, при котором я проверяю равенство строк, если они совпадают, я сохраняю их в Set. Затем я перебираю Set, чтобы проверить, присутствует ли значение ENUM3, если да, я заменяю эту конкретную строку значением String Java. Я использую Iterator для l oop и проверяю на равенство. Я ищу ту же функциональность с использованием потоков, где

1. I can loop through Set
2. Check for String equality
3. If ENUM3 found then replace with Java
4. Save all the matched String

Вот мой код

{
    Set<String> only = new HashSet<String>();
    Iterator<Mark> itr = Marks.iterator();
    while (itr.hasNext()) {
        Mark find = itr.next();

        if (ENUM1.getData().equals(find.search())||ENUM3.getData().equals(find.search())) {
            only.add(find.search());
            only = only.stream()
                    .map(macro -> macro.equals(ENUM3.getData()) ? "Java" : macro).collect(Collectors.toSet());
        }
    }
}

Вот то, что я пытался использовать Stream

only = only.stream()
            .map(macro -> macro.equals(ENUM3.getData()) ? "Java" : macro)
            .collect(Collectors.toSet());

1 Ответ

3 голосов
/ 17 января 2020

Это должно выполнить всю вашу операцию:

Set<String> only = Marks.stream()
    .map(Mark::search)
    .filter(mark -> ENUM1.getData().equals(mark) 
                    || ENUM2.getData().equals(mark) 
                    || ENUM3.getData().equals(mark))
    .map(macro -> macro.equals(ENUM3.getData()) ? "Java" : macro)
    .collect(Collectors.toSet());

Похоже, вы выполняете эти 2 без необходимости (оба из них избегаются в приведенном выше конвейере)

  • итерация по only в каждой итерации для замены ENUM3.getData() на Java
  • , неоднократно вызывая Mark.search()
...