简单的介绍一下list.stream()
这是JDK1.8的新特性,在1.8之前,或是通过便利的方式转换list集合或map集合稍有不便,从1.8开始,通过流的方式,优化了这一块的代码;
简单展示一下后面要用的对象
/**
*@Accessors(chain = true)链表模式开始
*@NoArgsConstructor 创建无参构造函数
*@AllArgsConstructor 创建全参构造函数
*lombok的几个方便的用法也在这里介绍了
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class IdValueVO implements Serializable {
private static final long serialVersionUID = 9084800180804278720L;
@ApiModelProperty(value="id", name="id")
private Integer id;
@ApiModelProperty(value="值", name="nameValue")
private String nameValue;
@ApiModelProperty(value="备注", name="remark")
private Integer remark;
}
应用
@Test
public void test4(){
System.out.println("-------创建list集合-----------");
List<IdValueVO> list = new ArrayList<>();
for (int i = 0 ; i<6;i++){
IdValueVO idValueVO = new IdValueVO();
idValueVO.setId(i)
.setNameValue("test" + i)
.setRemark(8 - i);
list.add(idValueVO);
}
/*
* 自定义key的规则,利用流将list中id大于3的对象存入list中
* Function.identity() :返回一个输出跟输入一样的Lambda表达式
* 对象,等价于形如t -> t形式的Lambda表达式。
* (existing, replacement) -> replacement):当出现key相同的情况时,新的value覆盖掉就得value;
*/
Map<Integer, IdValueVO> collect = list.stream().collect(Collectors.toMap(
idValueVO -> {
Integer id = idValueVO.getId();
if (id > 3) {
return id;
}
return null;
},
Function.identity(), (existing, replacement) -> existing));
System.out.println(collect.values().toString());
System.out.println("------map流转list------------");
List<IdValueVO> collect1 = collect.values().stream().collect(Collectors.toList());
System.out.println(collect1);
System.out.println("------创建list时存入map的value----------");
//下面这个方法更优于上面的方法,具体我就不解释了;
List<IdValueVO> idValueVOs = new LinkedList<>(collect.values());
System.out.println(idValueVOs);
System.out.println("------多插入一下数据----------");
//多插入一下数据
for (int i = 0 ; i<6;i++){
IdValueVO idValueVO = new IdValueVO();
idValueVO.setId(i)
.setNameValue("test" + i)
.setRemark(8 + i);
idValueVOs.add(idValueVO);
}
System.out.println(idValueVOs);
System.out.println("------list利用流进行排序,根据id进行排序,默认升序----------");
List<IdValueVO> collect4 = idValueVOs.stream().sorted(Comparator.comparing
(IdValueVO::getId)).collect(Collectors.toList());
System.out.println(collect4);
System.out.println("------list利用流进行排序,根据id进行排序,降序排序----------");
//排序结果后再排序相当于排序两次
List<IdValueVO> collect2 = idValueVOs.stream().sorted(Comparator.comparing(
IdValueVO::getId).reversed()).collect(Collectors.toList());
System.out.println(collect2);
//直接进行排序
List<IdValueVO> collect3 = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId
, Comparator.reverseOrder())).collect(Collectors.toList());
System.out.println(collect3);
System.out.println("------list利用流进行排序,根据id进行排序,降序排序**并返回前n个元素**----------");
List<IdValueVO> collect5 = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId
, Comparator.reverseOrder())).limit(2).collect(Collectors.toList());
System.out.println(collect5);
System.out.println("------list利用流进行排序,根据id进行排序,降序排序**并去除前 n 个元素**----------");
List<IdValueVO> collect6 = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId
, Comparator.reverseOrder())).skip(2).collect(Collectors.toList());
System.out.println(collect6);
System.out.println("------先根据id进行升序排序,再降序排序,结果再对remake升序排序----------");
List<IdValueVO> collect7 = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId)
.reversed().thenComparing(IdValueVO::getRemark)).collect(Collectors.toList());
System.out.println(collect7);
System.out.println("------先根据id进行降序排序,结果再对remake升序排序----------");
List<IdValueVO> collect8 = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId, Comparator.reverseOrder())
.thenComparing(IdValueVO::getRemark)).collect(Collectors.toList());
System.out.println(collect8);
System.out.println("------先根据id进行降序排序,结果再对remake降序排序----------");
Stream<IdValueVO> sorted = idValueVOs.stream().sorted(Comparator.comparing(IdValueVO::getId, Comparator.reverseOrder())
.thenComparing(IdValueVO::getRemark, Comparator.reverseOrder()));
List<IdValueVO> collect9 = sorted.collect(Collectors.toList());
System.out.println(collect9);
}
@Test
public void test5(){
PositionData positionData1 = new PositionData();
positionData1.setId(1);
PositionData positionData2 = new PositionData();
positionData2.setId(1);
PositionData positionData3 = new PositionData();
positionData3.setId(1);
ArrayList<PositionData> positionData = new ArrayList<PositionData>() {{
add(positionData1);
add(positionData2);
add(positionData3);
}};
//按照id分类
Map<Integer, List<PositionData>> collect =
positionData.stream().collect(Collectors.groupingBy(PositionData::getId));
System.out.println(collect.values());
}
运行结果如下
-------创建list集合-----------
[IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=5, nameValue=test5, remark=3)]
------map流转list------------
[IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=5, nameValue=test5, remark=3)]
------创建list时存入map的value----------
[IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=5, nameValue=test5, remark=3)]
------多插入一下数据----------
[IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=5, nameValue=test5, remark=13)]
------list利用流进行排序,根据id进行排序,默认升序----------
[IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13)]
------list利用流进行排序,根据id进行排序,降序排序----------
[IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
[IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
------list利用流进行排序,根据id进行排序,降序排序**并返回前n个元素**----------
[IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13)]
------list利用流进行排序,根据id进行排序,降序排序**并去除前 n 个元素**----------
[IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
------先根据id进行升序排序,再降序排序,结果再对remake升序排序----------
[IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
------先根据id进行降序排序,结果再对remake升序排序----------
[IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=5, nameValue=test5, remark=13), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
------先根据id进行降序排序,结果再对remake降序排序----------
[IdValueVO(id=5, nameValue=test5, remark=13), IdValueVO(id=5, nameValue=test5, remark=3), IdValueVO(id=4, nameValue=test4, remark=12), IdValueVO(id=4, nameValue=test4, remark=4), IdValueVO(id=3, nameValue=test3, remark=11), IdValueVO(id=2, nameValue=test2, remark=10), IdValueVO(id=1, nameValue=test1, remark=9), IdValueVO(id=0, nameValue=test0, remark=8), IdValueVO(id=0, nameValue=test0, remark=8)]
Disconnected from the target VM, address: '127.0.0.1:58272', transport: 'socket'
Process finished with exit code 0