前言
经常会遇到将对象列表转换为对应的对象ID的列表,而且又讨厌写重复的代码。下面我们将用Jdk8的stream来实现这个功能
对象转对象的某个属性
最重要还是利用了stream的map函数
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class Test {
@org.junit.jupiter.api.Test
void test(){
List<TestUser> list = new ArrayList<>();
list.add(TestUser.builder().name("杨过").id(1).build());
list.add(TestUser.builder().name("小龙女").id(2).build());
List<Integer> ids = list.stream()
.map(TestUser::getId)
.collect(Collectors.toList());
log.info("ids:{}",ids);
}
@Getter
@Setter
@Builder
public static class TestUser{
private String name;
private Integer id;
}
}
关于stream()的map
本质上它是对数据流的一种映射关系定义,相当于它内部有自己的迭代器遍历,我们只需要在map中传入处理逻辑即可,map的输入是输入流的一个数据单元,输出可以是任意的。因此我们以后涉及到数据流映射的时候,都可以用它.
对象某个属性转对象
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class Test {
@org.junit.jupiter.api.Test
void test(){
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
List<TestUser> userList = list.stream()
.map(k->TestUser.builder().id(k).build())
.collect(Collectors.toList());
}
@Getter
@Setter
@Builder
public static class TestUser{
private String name;
private Integer id;
}
}
关于stream()的flatmap
flatmap与map非常类似,不过我们从字面意思来理解,
map表示映射
,flat表示平,展开
所以我们从命名可以这么理解,flatmap表示,将stream流中的所有子stream流合并。
示例代码
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
public class Test {
@org.junit.jupiter.api.Test
void test(){
Map<Integer,List<TestUser>> map = new HashMap<>();
List<TestUser> list = new ArrayList<>();
list.add(TestUser.builder().name("杨过").id(1).build());
list.add(TestUser.builder().name("小龙女").id(2).build());
map.put(1,list);
map.put(2,list);
List<TestUser> userList = map.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
//user size:4,每个stream被合并
log.info("user size:{}",userList.size());
}
@Getter
@Setter
@Builder
public static class TestUser{
private String name;
private Integer id;
}
}