> ## Content Index
> Fetch the complete content index at: https://lucent.blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# Stream管道流的map操作
- URL: https://lucent.blog/streamguan-dao-liu-de-mapcao-zuo/
- Published: 2020-06-25T02:02:48.000Z
- Updated: 2026-08-21T00:49:55.000Z
- Author: Lucent
- Tags: java, Stream API

### Stream管道流map的基础用法

将集合中的每一个字符串，全部转换成大写：

```
List<String> alpha = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
List<String> collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect);

```

结果：

```
[MONKEY, LION, GIRAFFE, LEMUR]

```

map()函数不仅可以处理数据，还可以转换数据的类型：

```
List<Integer> lengths = alpha.stream()
        .map(String::length)
        .collect(Collectors.toList());
System.out.println(lengths); 

```

结果：

```
[6, 4, 7, 5]

```

```
Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .mapToInt(String::length)
        .forEach(System.out::println);

```

结果：

```
6
4
7
5

```

### 处理对象数据

将每一个Employee的年龄增加一岁并且将性别中的“M”换成“male”，F换成Female：

```
Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
            Employee e2 = new Employee(2,13,"F","Martina","Hengis");
            Employee e3 = new Employee(3,43,"M","Ricky","Martin");
            Employee e4 = new Employee(4,26,"M","Jon","Lowman");
            Employee e5 = new Employee(5,19,"F","Cristine","Maria");
            Employee e6 = new Employee(6,15,"M","David","Feezor");
            Employee e7 = new Employee(7,68,"F","Melissa","Roy");
            Employee e8 = new Employee(8,79,"M","Alex","Gussin");
            Employee e9 = new Employee(9,15,"F","Neetu","Singh");
            Employee e10 = new Employee(10,45,"M","Naveen","Jain");

            List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
//使用map
List<Employee> maped = employees.stream()
                .map(e -> {
                    e.setAge(e.getAge() + 1);
                    e.setGender(e.getGender().equals("M")?"male":"female");
                    return e;
                }).collect(Collectors.toList());
            System.out.println(maped);
//使用peek
maped = employees.stream()
                .peek(e -> {
                    e.setAge(e.getAge() + 2);
                    e.setGender(e.getGender().equals("M")?"male":"female");
                }).collect(Collectors.toList());
        System.out.println(maped);

```

peek函数是一种特殊的map函数，当函数没有返回值或者参数就是返回值的时候可以使用peek函数。

### flatMap

map可以对管道流中的数据进行转换操作，但是如果管道中还有管道该如何处理？即：如何处理二维数组及二维集合类。  
一个简单的需求：将“hello”，“world”两个字符串组成的集合，元素的每一个字母打印出来：

```
 List<String> words = Arrays.asList("hello", "word");
        words.stream()
                .map(w -> Arrays.stream(w.split("")))    
                .forEach(System.out::println);

```

结果：

```
java.util.stream.ReferencePipeline$Head@67424e82
java.util.stream.ReferencePipeline$Head@42110406

```

用map方法是做不到的，这个需求用map方法无法实现。map只能针对一维数组进行操作，数组里面还有数组，管道里面还有管道，它是处理不了每一个元素的。  
而flatMap可以做到：

```
words.stream()
        .flatMap(w -> Arrays.stream(w.split(""))) 
        .forEach(System.out::println);

```

结果：

```
h
e
l
l
o
w
o
r
d

```