前言
在前天的时候,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<Integer> 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<String> 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<Person> list = new ArrayList();
list.add(new Person("1001", "小A"));
list.add(new Person("1002", "小B"));
list.add(new Person("1003", "小C"));
//将list转换map
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
但是有一点需要注意,就是Collectors中的tomap 方法,value值也是不允许重复的,如果想要转成HashMap的话,还是使用forEach比较方便
处理String类型的String
对List类型进行处理的时候,需要重新返回一个List,因为String都是final的
List<String> collectUserB = source.stream().filter(username -> username.startsWith("B-")).map(bUser -> {
bUser = "B-" + userService.getPerson(bUser.replace("B-", "")).getDisplayName();
return bUser;
}).collect(Collectors.toList());