前言
在前天的时候,java12都出了,但是我还在用java6的陈旧的编码方式,需要改进到java8的流式编程,此文主要是用来记录流式编程的积累
个人的主要理解
java真正的支持了函数式的编程,同时加入了streamApi来进行支持Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Stream编程
总而言之,流式操作主要分为了中间操作和最终操作
Intermediate 操作
非最终操作,也就是中间操作map (mapToInt, flatMap 等)
filter
distinct
sorted
peek
limit
skip
parallel
sequential
unordered
Terminal 操作
最终操作forEach
forEachOrdered
toArray
reduce
collect
min
max
count
anyMatch
allMatch
noneMatch
findFirst
findAny
iterator
Short-circuiting 操作
短程巡回操作anyMatch
allMatch
noneMatch
findFirst
findAny
limit
实操例子
将一个列表/数组进行处理进行转换
例子如下:
Set collect = projects
.stream()
.map(CustomProject::getId)
.collect(Collectors.toSet());
代码翻译:projects是CustomProject的一个List
然后map()进行一个映射
将其中的id属性去除,
collect()可以转换成另外的数据结构集合
filter过滤和forEach
例子如下:
all.stream().filter(greyTask ->
greyTask.getType() == GreyTaskType.PERSON
).forEach(greyTask1 -> {
List source = greyTask1.getSource();
source.stream().filter(username -> username.startsWith("B-")).forEach(bUser -> {
bUser = "B-" + 处理bUser的代码;
});
source.stream().filter(userId -> userId.startsWith("C-")).forEach(cUser -> {
cUser = "C-" + 处理cUser的代码;
});
greyTask1.setSource(source);
});
转换成map
例子如下:
List list = new ArrayList();
list.add(new Person("1001", "小A"));
list.add(new Person("1002", "小B"));
list.add(new Person("1003", "小C"));
//将list转换map
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
但是有一点需要注意,就是Collectors中的tomap 方法,value值也是不允许重复的,如果想要转成HashMap的话,还是使用forEach比较方便
处理String类型的String
对List类型进行处理的时候,需要重新返回一个List,因为String都是final的
List collectUserB = source.stream().filter(username -> username.startsWith("B-")).map(bUser -> {
bUser = "B-" + userService.getPerson(bUser.replace("B-", "")).getDisplayName();
return bUser;
}).collect(Collectors.toList());