Stream流学习mapping
- 一、前言
- 1. 基本用法
- 2. 结合 `Collectors.mapping`
- 3. 自定义转换函数
- 4.总结
一、前言
在Java的Stream API中,mapping
是一个非常有用的中间操作,它可以将流中的元素映射成其他形式。通常与 Collectors.groupingBy
或者 Collectors.mapping
结合使用,用于对流中的元素进行转换和处理。
1. 基本用法
mapping
的基本用法是将流中的元素映射为另一种类型,然后可以结合其他收集器将映射后的结果收集起来。
例如,假设有一个 Person
类:
class Person {private String name;private int age;// 省略构造函数和getter/setter
}
现在我们想要将 Person
对象的名字映射为大写形式的列表:
List<Person> persons = Arrays.asList(new Person("Alice", 23),new Person("Bob", 25),new Person("Charlie", 30)
);List<String> namesInUpperCase = persons.stream().map(Person::getName) // 映射为名字的流.map(String::toUpperCase) // 将名字转换为大写形式.collect(Collectors.toList());System.out.println(namesInUpperCase); // 输出 [ALICE, BOB, CHARLIE]
2. 结合 Collectors.mapping
Collectors.mapping
收集器允许我们在收集流中元素时,对流中的每个元素应用一个转换函数,并将转换后的结果收集起来。
例如,如果我们想要将 Person
对象按照年龄进行分组,并且每组只保留他们的名字:
Map<Integer, List<String>> namesByAge = persons.stream().collect(Collectors.groupingBy(Person::getAge, // 按照年龄分组Collectors.mapping(Person::getName, Collectors.toList()) // 将名字映射并收集到列表中));System.out.println(namesByAge);
输出结果将会是按照年龄分组后的每个年龄组的人员名单列表。
3. 自定义转换函数
在一些情况下,可能需要自定义转换函数来将流中的元素映射为不同的形式。例如,将字符串转换为它们的长度:
List<String> words = Arrays.asList("apple", "banana", "orange");List<Integer> wordLengths = words.stream().map(String::length) // 将字符串映射为它们的长度.collect(Collectors.toList());System.out.println(wordLengths); // 输出 [5, 6, 6]
这里使用了 map(String::length)
将每个字符串映射为它们的长度。
4.总结
mapping
在Java Stream API中是一个重要的操作,它使得我们能够对流中的元素进行灵活的转换和映射,从而更方便地处理和操作数据。结合其他操作如 groupingBy
或者 toList
,可以实现复杂的数据处理需求,提高代码的简洁性和可读性。