Java 8: несколько условий в функции карты потока

Как использовать несколько условий в функции карты потока? Я новичок в потоках Java, на самом деле я хочу использовать несколько условий в карте потока, например:

List<String> cs = Arrays.asList("agent", "manager", "admin");

List<String> replace = cs.stream()
.map(p -> p.equals("agent") ? "manager" : p || p.equals("manager") ? "agent" : p )
.collect(Collectors.toList());

Я хочу заменить агента менеджером, а менеджера агентом. То есть, если в списке есть агент, замените его менеджером, а если менеджер существует, замените его агентом.

А ваш вопрос? Также: строки сравниваются не с использованием ==, а с использованием .equals.

f1sh 31.10.2018 11:40

почему используется map вместо filter?

Hadi J 31.10.2018 11:41

@HadiJ, потому что map - это именно то, что вам нужно, как filter поможет?

f1sh 31.10.2018 11:43
4
3
5 224
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вы можете сделать это так,

List<String> interchanged = cs.stream()
    .map(s -> s.equals("manager") ? "agent" : s.equals("agent") ? "manager" : s)
    .collect(Collectors.toList());

Другой способ сделать это с помощью List.replaceAll:

List<String> cs = Arrays.asList("agent", "manager", "admin");
cs.replaceAll(s -> {
    if (s.equals("manager")) {
        return "agent";
    }
    if (s.equals("agent")) {
        return "manager";
    }
    return s;
});

Для удобочитаемости вы можете проверить это

List<String> cs = Arrays.asList("agent", "manager", "admin");

List<String> replace = cs.stream()
.map(p -> { 
  if(p.equals("agent"))
   p = "manager"; 
  else if(p.equals("manager"))
   p = "agent; 

  return p;
})
.collect(Collectors.toList());

Возможно, это основано на мнении, но по некоторым причинам я считаю код в ответе Равиндры более читабельным.

Naman 31.10.2018 11:50

Другой способ был бы таким:

cs.replaceAll(s->s.replaceAll("agent|manager",replace(s)));



String replace(String s){
    return s.equals("manager")?"agent" :s.equals("agent")?"manager": s;
}
List<String> replace = cs.stream()
                .map(p -> p.equals("agent") ? "manager" : p.equals("manager") ? "agent" : p )
                .collect(Collectors.toList());

Это поможет вам в этом случае, но если вам нужно больше условий, используйте такой стиль тела.

map(p -> {...})

для создания читаемого кода.

То же, что и другой ответ

Naman 31.10.2018 12:15

Другие ответы показывают, как работать с двумя вариантами замены элементов. Вот более общий подход:

Map<String, String> replacements = Map.of("agent", "manager", "manager", "agent");

List<String> replace = cs.stream()
    .map(p -> replacements.getOrDefault(p, p))
    .collect(Collectors.toList());

Если у вас есть другие слова, которые нужно заменить, просто добавьте их на карту replacements.

Другие вопросы по теме