Как построить поток в функции, используя Java 8 - PullRequest
0 голосов
/ 29 марта 2019

У меня есть функция, подобная приведенной ниже.

    public static List xyz(Map<String, String> m) {
      if(functionWithSomeLogic(m)) {
        return ImmutableList.of("A", "B");
      }
      if(functionWithSomeOtherLogic(m)) {
        return ImmutableList.of("C", "D");
      }
      List<String> collect = m.keySet().stream().collect(Collectors.toList());
      return collect;
    }

Я хочу узнать, как преобразовать эту функцию для использования потоков и возвращать различные списки в зависимости от условий.

Я хочу иметь возможностьписать как

`Optional.of(m).map(m->{if (functionWithSomeLogic(m)) return ImmutableList.of("A", "B")}` 

Но я не могу удержаться на одном уровне, если происходит ветвление с разными возвратами.

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

1 Ответ

1 голос
/ 29 марта 2019

Вы можете создать карту со всеми возможными предикатами и их значениями:

public class Temp2 {

   static final Map<Predicate<Map<String, String>>, List<String>> mapper = 
    ImmutableMap.of(
      Temp2::functionWithSomeLogic, ImmutableList.of("A", "B"),
      Temp2::functionWithSomeOtherLogic, ImmutableList.of("C", "D")
    );

   public static List<String> zyx(Map<String, String> m) {
       return mapper.entrySet().stream()
            .filter(entry -> entry.getKey().apply(m))
            .map(Map.Entry::getValue)
            .findFirst()
            .orElseGet(() -> new ArrayList<>(m.values()));
   }
   //functionWithSomeLogic && functionWithSomeOtherLogic below
}

и назвать ее так просто:

public static void main(String[] args) {
    Map<String, String> someMap = new HashMap<>();
    //...
    List<String> list = xyz(someMap);
}
...