Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream(流)是一个来自数据源的元素队列并支持聚合操作。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
简单总结一下常用的API方法
数据准备
DTO
public class StreamDemoDTO {
private int id;
private String name;
private int age;
private int sex;
private Date birthDay;
// getter && setter
// Override toString for print
}
init
public static void initList() throws ParseException {
sdf.applyPattern(YYYY_MM_DD_PATTERN);
StreamDemoDTO dto1 = new StreamDemoDTO(1,"刘一",18,0,sdf.parse("1990-11-22"));
StreamDemoDTO dto2 = new StreamDemoDTO(1,"陈二",20,1,sdf.parse("2000-10-22"));
StreamDemoDTO dto3 = new StreamDemoDTO(1,"张三",16,1,sdf.parse("1998-01-12"));
StreamDemoDTO dto4 = new StreamDemoDTO(1,"李四",55,0,sdf.parse("1990-11-05"));
StreamDemoDTO dto5 = new StreamDemoDTO(1,"王五",60,0,sdf.parse("1990-06-06"));
StreamDemoDTO dto6 = new StreamDemoDTO(1,"赵六",33,1,sdf.parse("1997-01-09"));
StreamDemoDTO dto7 = new StreamDemoDTO(1,"钱七",40,0,sdf.parse("1994-02-09"));
StreamDemoDTO dto8 = new StreamDemoDTO(1,"周八",28,1,sdf.parse("1999-12-18"));
StreamDemoDTO dto9 = new StreamDemoDTO(1,"吴九",31,0,sdf.parse("1990-05-22"));
StreamDemoDTO dto10 = new StreamDemoDTO(1,"郑十",30,1,sdf.parse("1995-04-03"));
demoDTOList.add(dto1);
demoDTOList.add(dto2);
demoDTOList.add(dto3);
demoDTOList.add(dto4);
demoDTOList.add(dto5);
demoDTOList.add(dto6);
demoDTOList.add(dto7);
demoDTOList.add(dto8);
demoDTOList.add(dto9);
demoDTOList.add(dto10);
}
forEach
迭代流中的每个数据
demoDTOList.forEach(System.out::println);
demoDTOList.forEach( dto -> {
System.out.println(dto.getName());
});
map
用于映射每个元素到对应的结果
List<Integer> idList = demoDTOList.stream().map(StreamDemoDTO::getId).collect(Collectors.toList());
filter
用于通过设置的条件过滤出元素
List<StreamDemoDTO> ageBiggerThan18 = demoDTOList.stream().filter(streamDemoDTO -> streamDemoDTO.getAge() > 18).collect(Collectors.toList());
limit
用于获取指定数量的流
List<StreamDemoDTO> limitDemoList = demoDTOList.stream().limit(3).collect(Collectors.toList());
sorted
用于对流进行排序
List<StreamDemoDTO> sortedByAgeList = demoDTOList.stream().sorted(Comparator.comparing(StreamDemoDTO::getAge)).collect(Collectors.toList());
count
long count = demoDTOList.stream().count();
distinct
用于去重
List<String> distinctNameList = demoDTOList.stream().map(StreamDemoDTO::getName).distinct().collect(Collectors.toList());
reversed
用于反转顺序
List<StreamDemoDTO> sortedByAgeDescList = demoDTOList.stream().sorted(Comparator.comparing(StreamDemoDTO::getAge).reversed()).collect(Collectors.toList());
Collectors
实现了很多归约操作
String names = demoDTOList.stream().map(StreamDemoDTO::getName).collect(Collectors.joining(","));
Set<String> nameSet = demoDTOList.stream().map(StreamDemoDTO::getName).collect(Collectors.toSet());
List<String> distinctNameList = demoDTOList.stream().map(StreamDemoDTO::getName).distinct().collect(Collectors.toList());
Map<Integer, StreamDemoDTO> streamDemoDTOMap = demoDTOList.stream().collect(Collectors.toMap(StreamDemoDTO::getId, Function.identity()));
findAny
StreamDemoDTO findAny = demoDTOList.stream().findAny().get();
findFirst
StreamDemoDTO findFirst = demoDTOList.stream().findFirst().get();
实际场景下,需要根据需求使用各个API的组合才能满足代码需要。
代码参考:https://gitee.com/code-promotion/my-code-test/tree/dev/src/main/java/cn/pengld/streamtest