.stream() 转成另一个实体的集合
时间: 2024-09-09 20:15:09 浏览: 143
`.stream()` 是Java 8引入的一种现代流式处理API,它允许你在集合上执行并行或串行的高阶操作,而无需显式地创建中间集合。当你想要将一个集合转换成另一个实体的集合时,可以使用`collect()`方法配合一些收集器(如`Collectors.toList()`、`Collectors.toSet()`等)。例如:
```java
List<String> originalList = Arrays.asList("a", "b", "c");
List<Integer> transformedList = originalList.stream()
.map(String::chars) // 将每个字符串转换为字符数组
.mapToInt(Character::ordinal) // 将字符数组映射为整数(按照字母顺序)
.boxed() // 将IntStream转换回List<Int>
.collect(Collectors.toList()); // 使用 Collectors.toList() 收集结果
System.out.println(transformedList); // 输出 [0, 1, 2]
```
在这个例子中,我们首先将`originalList`中的元素通过`map()`函数转换为`Character`数组,然后进一步转换为整数,并最终收集到一个新的`List<Integer>`中。
相关问题
现在有一个实体类的集合,需要拿到实体内一个属性,组成一个集合,用javastream流实现
假设实体类为`Person`,需要获取其中的`name`属性,可以按以下方式实现:
```java
List<Person> personList = new ArrayList<>();
//...向personList中添加元素
List<String> nameList = personList.stream()
.map(Person::getName)
.collect(Collectors.toList());
```
上述代码中,通过`stream()`方法将`List`转化为`Stream`,然后通过`map()`方法将`Person`对象转化为其`name`属性,最后通过`collect()`方法将`Stream`转化为`List<String>`类型的集合`nameList`。
一个实体类list集合 实体类有 名字和身份证属性,会有同名但身份证属性不同的人,使用stream过滤一个map集合,key是名字,value是list集合,是所有同名人的身份证号码,
在Java中,如果你有一个实体类`Person`,包含`name`和`idNumber`两个属性,并且你有一个Map集合,其中key是名字,value是一个List,存储了同名人的`Person`对象列表。如果你想通过Stream API过滤出每个名字对应的唯一的身份证号码,你可以这样做:
```java
import java.util.*;
import java.util.stream.Collectors;
class Person {
String name;
String idNumber;
}
Map<String, List<Person>> personMap; // 假设这是你的map
// 使用Stream处理
Map<String, Set<String>> uniqueIdsByNames = personMap.entrySet()
.stream() // 遍历map的键值对
.flatMap(entry -> entry.getValue().stream()) // 对于每个值列表,流式处理每一个人
.collect(Collectors.groupingBy(Person::getName, Collectors.mapping(Person::getIdNumber, Collectors.toSet())));
// 现在uniqueIdsByNames是一个新的Map,key是名字,value是该名字下的唯一ID集合
```
这个代码片段首先将Map的每个值列表转换成流,然后通过`groupingBy`函数按名字分组,再使用`mapping`函数提取每个人的身份证号码并收集到一个Set中,确保每个名字对应的所有身份证号码都不重复。
阅读全文