Ты отличаешься между .map и .flatMap?

Я работаю с Streams (Java 8), и когда я использую метод .stream() у меня не остается ясным различие между .map и .flatMap. Какие различия есть между этими методами?

3
задан 04.04.2016, 16:25
2 ответа

Различие состоит в том, что map() возвращает того же самого nГєmero элементов, что Stream ввода, так как это просто одна proyecciГіn элементов ввода. А именно каждый элемент ввода преобразовывается в элемент вывода.

С другой стороны .flatMap(), проектирует список элементов каждого первоначального элемента и прилагает в Гєnico stream .

Например:

map ()

List<Integer> numeros = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4)); // [1, 2, 3, 4]

List<Integer> cuadrados = numeros
  .stream()
  .map( x -> x * x)
  .collect(Collectors.toList());

for (Integer n : cuadrados) {
  System.out.println(n);
}

// Imprime el cuadrado de los números de entrada. 4 elementos de entrada, 4 de salida
// 1
// 4
// 9
// 16

flatMap ()

List<List<Integer>> listaBidimensional = new ArrayList<List<Integer>>(Arrays.asList(
  new ArrayList<Integer>(Arrays.asList(1, 2)),
  new ArrayList<Integer>(Arrays.asList(3, 4))
));
// [
//   [1, 2],
//   [3, 4]
// ]


List<Integer> listaAplanada = listaBidimensional
  .stream()
  .flatMap( listaInterna -> listaInterna.stream())
  .collect(Collectors.toList());


for (Integer n : listaAplanada) {
  System.out.println(n);
}

// Imprime los números de entrada en una sola lista de 1 dimensión.
// 2 elementos de entrada (2 listas), 4 de salida
// 1
// 2
// 3
// 4
7
ответ дан 24.11.2019, 14:38
  • 1
    Большое спасибо, он подал достаточно мне! – RoyalUp 04.04.2016, 19:34
  • 2
    Помогая изучается достаточно tambi и # 233; n – Carlos Muñoz 04.04.2016, 19:47

Так как различие состоит в том, что .map производит стоимость вывода из-за каждой стоимости ввода и .flatmap производит с нуля до n стоимость вывода из-за каждой стоимости ввода, более или менее следующей формы:

map:: Стреам Т (I-> O) flapmap:: Стреам Т (I-> Stream O)

присоединил Тебе один cГіdigo примера:

public class Developer {
  private String name;
  private Set<String> languages;

  public Developer(String name) {
    this.languages = new HashSet<>();
    this.name = name;
  }

  public void add(String language) {
    this.languages.add(language);
  }

  public Set<String> getLanguages() {
    return languages;
  }
}

public class FlatMapTest {
  @Test
  public void flatMap() {
    List<Developer> team = new ArrayList<>();
    Developer polyglot = new Developer("experto");
    polyglot.add("clojure");
    polyglot.add("scala");
    polyglot.add("groovy");
    polyglot.add("go");

    Developer busy = new Developer("estandard");
    busy.add("java");
    busy.add("javascript");

    Developer becario = new Developer("becario");

    team.add(polyglot);
    team.add(busy);
    team.add(becario);

    List<String> teamLanguages = team.stream().
         map(d -> d.getLanguages()).
         flatMap(l -> l.stream()).
         collect(Collectors.toList());

    assertTrue(teamLanguages.containsAll(polyglot.getLanguages()));
    assertTrue(teamLanguages.containsAll(busy.getLanguages()));

  }
}
4
ответ дан 24.11.2019, 14:38
  • 1
    Большое спасибо, он подал меня – RoyalUp 04.04.2016, 19:34

Теги

Похожие вопросы