Collectors.toMap Function.identity()
时间: 2023-12-01 10:43:41 浏览: 121
`Collectors.toMap(Function.identity())`是一个用于将流中的元素收集到一个Map中的方法,其中`Function.identity()`表示使用元素本身作为Map的key。例如,以下代码将一个字符串列表转换为一个Map,其中字符串本身是key,字符串长度是value:
```java
List<String> list = Arrays.asList("apple", "banana", "orange");
Map<String, Integer> map = list.stream().collect(Collectors.toMap(Function.identity(), String::length));
```
这将生成一个Map,其中键是字符串本身,值是字符串的长度。在这个例子中,Map的内容将是:
```
{apple=5, banana=6, orange=6}
```
相关问题
Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData)
`Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData)` 是一个使用 `toMap` 方法的特殊形式,它的作用是将一个流(Stream)中的元素转换成一个 Map 对象,并且如果有重复的键,则使用新值覆盖旧值。
具体来说,它的语法如下:
```java
toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
```
其中,`keyMapper` 表示将流中元素转换成 Map 中的键(Key)的函数,`valueMapper` 表示将流中元素转换成 Map 中的值(Value)的函数,`mergeFunction` 表示当出现重复键时如何处理新旧值的合并。在这个特殊形式中,`keyMapper` 和 `valueMapper` 都使用了 `Function.identity()` 方法,它表示将元素本身作为键和值。
而 `mergeFunction` 则使用了一个简单的 lambda 表达式 `(oldData, newData) -> newData`,它表示当出现重复键时,使用新值覆盖旧值。
例如,假设有一个包含学生信息的列表,每个学生信息包含学生姓名和成绩,我们可以使用这个特殊形式的 `toMap` 方法将学生信息转换成一个以学生姓名为键,成绩为值的 Map 对象,代码如下:
```java
List<Student> students = Arrays.asList(
new Student("Tom", 90),
new Student("Jerry", 80),
new Student("Lucy", 85),
new Student("Tom", 95)
);
Map<String, Integer> studentMap = students.stream()
.collect(Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData));
System.out.println(studentMap);
```
其中,`Student` 类包含 `getName` 和 `getScore` 方法用于获取学生姓名和成绩,运行结果为:
```
{Tom=95, Jerry=80, Lucy=85}
```
即将学生姓名作为键,成绩作为值,转换成了一个 Map 对象,并且由于出现了重复的键(Tom),使用新值(95)覆盖了旧值(90)。
Collectors.toMap(Function.identity(), e -> 0L)
`Collectors.toMap(Function.identity(), e -> 0L)` 是 Java 中 `Collectors` 类的一个静态方法,用于将流中的元素转换为一个 `Map` 对象。它接受两个参数,第一个参数是一个函数,表示如何将流中的元素映射为 `Map` 的键,而第二个参数是一个函数,表示如何将流中的元素映射为 `Map` 的值。
在你提供的这个例子中,`Function.identity()` 表示将流中的元素作为键,保持不变。而 `e -> 0L` 表示将流中的每个元素映射为固定的值 `0L`。
以下是一个简单的示例,展示了如何使用 `Collectors.toMap(Function.identity(), e -> 0L)`:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ToMapExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange");
Map<String, Long> fruitCountMap = fruits.stream()
.collect(Collectors.toMap(Function.identity(), e -> 0L));
System.out.println(fruitCountMap);
// 输出:{apple=0, banana=0, orange=0}
}
}
```
在上面的示例中,我们有一个包含水果名称的列表 `fruits`。我们使用流来将列表中的水果转换为一个 `Map`,其中键是水果名称,值都设置为 `0L`。最后,我们打印输出这个 `Map`,得到 `{apple=0, banana=0, orange=0}`。
总结起来,`Collectors.toMap(Function.identity(), e -> 0L)` 可以用于将流中的元素转换为一个键值对 `Map`,其中键是流中的元素本身,值可以是固定的值或者根据元素进行计算得到的值。
阅读全文