Skip to content

Commit 2d20554

Browse files
committed
📝 update datetimeapi url
1 parent d6714d8 commit 2d20554

File tree

10 files changed

+160
-35
lines changed

10 files changed

+160
-35
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ Java8 改变了我们思考和编码的方式,在这里你可以学习到 Java
2929
|第 7 课 | [干掉空指针之 Optional](https://github.com/biezhi/learn-java8/blob/master/java8-optional/README.md) | [网易云课堂](http://study.163.com/course/courseLearn.htm?courseId=1005047049&utm_campaign=commission&utm_source=cp-400000000397038&utm_medium=share#/learn/video?lessonId=1051511464&courseId=1005047049) ¦ [哔哩哔哩](https://www.bilibili.com/video/av19287893/index_7.html#page=7) ¦ [Youtube](https://youtu.be/br4kqCXPB9A) | [optional](https://github.com/biezhi/learn-java8/tree/master/java8-default-methods/src/main/java/io/github/biezhi/java8/optional) |
3030
|第 8 课 | [理解 Stream](https://github.com/biezhi/learn-java8/blob/master/java8-stream/README.md) | [网易云课堂](http://study.163.com/course/courseLearn.htm?courseId=1005047049&utm_campaign=commission&utm_source=cp-400000000397038&utm_medium=share#/learn/video?lessonId=1051555343&courseId=1005047049) ¦ [哔哩哔哩](https://www.bilibili.com/video/av19287893/index_8.html#page=8) ¦ [Youtube](https://youtu.be/NB9mGlNMl-w) | [stream](https://github.com/biezhi/learn-java8/tree/master/java8-stream/src/main/java/io/github/biezhi/java8/stream/lesson1) |
3131
|第 9 课 | [Stream API(上)](https://github.com/biezhi/learn-java8/blob/master/java8-stream/README.md#%E4%BD%BF%E7%94%A8%E6%B5%81) | [网易云课堂](http://study.163.com/course/courseLearn.htm?courseId=1005047049&utm_campaign=commission&utm_source=cp-400000000397038&utm_medium=share#/learn/video?lessonId=1051566020&courseId=1005047049) ¦ [哔哩哔哩](https://www.bilibili.com/video/av19287893/index_9.html#page=9) ¦ [Youtube](https://youtu.be/mGwFJERNzmY) | [stream](https://github.com/biezhi/learn-java8/blob/master/java8-stream/src/main/java/io/github/biezhi/java8/stream/lesson2) |
32-
|第 10 课 | Stream API(下)| 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |
33-
|第 11 课 | 新的日期时间 API | 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |
32+
|第 10 课 | [Stream API(下)]() | 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |
33+
|第 11 课 | [新的日期时间 API](https://github.com/biezhi/learn-java8/blob/master/java8-datetime-api/README.md) | [网易云课堂](http://study.163.com/course/courseLearn.htm?courseId=1005047049&utm_campaign=commission&utm_source=cp-400000000397038&utm_medium=share#/learn/video?lessonId=1051571688&courseId=1005047049) ¦ 哔哩哔哩 ¦ [Youtube](https://youtu.be/hKXJvh-id1E) | [datetime](https://github.com/biezhi/learn-java8/tree/master/java8-datetime-api/src/main/java/io/github/biezhi/datetime) |
3434
|第 12 课 | 并发增强 | 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |
3535
|第 13 课 | CompletableFuture | 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |
3636
|第 14 课 | Nashorn 引擎 | 网易云课堂 ¦ 哔哩哔哩 ¦ Youtube | |

java8-stream/README.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,35 @@ OptionalInt maxAge = list.stream()
323323

324324
## Collector 收集
325325

326+
### 归约
327+
328+
流由一个个元素组成,归约就是将一个个元素“折叠”成一个值,如求和、求最值、求平均值都是归约操作。
329+
330+
### 一般性归约
331+
332+
若你需要自定义一个归约操作,那么需要使用 `Collectors.reducing` 函数,该函数接收三个参数:
333+
334+
* 第一个参数为归约的初始值
335+
* 第二个参数为归约操作进行的字段
336+
* 第三个参数为归约操作的过程
337+
338+
## 汇总
339+
340+
Collectors类专门为汇总提供了一个工厂方法:`Collectors.summingInt`
341+
它可接受一 个把对象映射为求和所需int的函数,并返回一个收集器;该收集器在传递给普通的 `collect` 方法后即执行我们需要的汇总操作。
342+
343+
### 分组
344+
345+
数据分组是一种更自然的分割数据操作,分组就是将流中的元素按照指定类别进行划分,类似于SQL语句中的 `GROUPBY`
346+
347+
### 多级分组
348+
349+
多级分组可以支持在完成一次分组后,分别对每个小组再进行分组。
350+
使用具有两个参数的 `groupingBy` 重载方法即可实现多级分组。
351+
352+
* 第一个参数:一级分组的条件
353+
* 第二个参数:一个新的 `groupingBy` 函数,该函数包含二级分组的条件
354+
326355
**Collectors 类的静态工厂方法**
327356

328357
| 工厂方法 | 返回类型 | 用途 | 示例 |
@@ -341,3 +370,32 @@ OptionalInt maxAge = list.stream()
341370
| `collectingAndThen` | 转换函数返回的类型 | 包含另一个收集器,对其结果应用转换函数 | `int howManyProjects = projectStream.collect(collectingAndThen(toList(), List::size));` |
342371
| `groupingBy` | `Map<K, List<T>>` | 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键 | `Map<String,List<Project>> projectByLanguage = projectStream.collect(groupingBy(Project::getLanguage));` |
343372
| `partitioningBy` | `Map<Boolean,List<T>>` | 根据对流中每个项目应用断言的结果来对项目进行分区 | `Map<Boolean,List<Project>> vegetarianDishes = projectStream.collect(partitioningBy(Project::isVegetarian));` |
373+
374+
### 转换类型
375+
376+
有一些收集器可以生成其他集合。比如前面已经见过的 `toList`,生成了 `java.util.List` 类的实例。
377+
还有 `toSet``toCollection`,分别生成 `Set``Collection` 类的实例。
378+
到目前为止, 我已经讲了很多流上的链式操作,但总有一些时候,需要最终生成一个集合——比如:
379+
380+
- 已有代码是为集合编写的,因此需要将流转换成集合传入;
381+
- 在集合上进行一系列链式操作后,最终希望生成一个值;
382+
- 写单元测试时,需要对某个具体的集合做断言。
383+
384+
使用 `toCollection`,用定制的集合收集元素
385+
386+
```java
387+
stream.collect(toCollection(TreeSet::new));
388+
```
389+
390+
还可以利用收集器让流生成一个值。 `maxBy` 和 `minBy` 允许用户按某种特定的顺序生成一个值。
391+
392+
### 数据分区
393+
394+
分区是分组的特殊情况:由一个断言(返回一个布尔值的函数)作为分类函数,它称分区函数。
395+
分区函数返回一个布尔值,这意味着得到的分组 `Map` 的键类型是 `Boolean`,于是它最多可以分为两组: true是一组,false是一组。
396+
397+
分区的好处在于保留了分区函数返回truefalse的两套流元素列表。
398+
399+
### 并行流
400+
401+
并行流就是一个把内容分成多个数据块,并用不不同的线程分别处理每个数据块的流。最后合并每个数据块的计算结果。

java8-stream/src/main/java/io/github/biezhi/java8/stream/Project.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public static List<Project> buildData(){
5555
data.add(Project.builder().name("Tale").language("java").author("biezhi")
5656
.stars(2600).forks(2300).description("Best beautiful java blog, worth a try").build());
5757

58+
data.add(Project.builder().name("Tale").language("javascript").author("biezhi")
59+
.stars(2600).forks(2300).description("Best beautiful java blog, worth a try").build());
60+
5861
data.add(Project.builder().name("Vue.js").language("js").author("yyx990803")
5962
.stars(83000).forks(10322).description("A progressive, incrementally-adoptable JavaScript framework for building UI on the web.").build());
6063

java8-stream/src/main/java/io/github/biezhi/java8/stream/lesson3/Example1.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package io.github.biezhi.java8.stream.lesson3;
22

33
import io.github.biezhi.java8.stream.Project;
4+
import static java.util.stream.Collectors.*;
45

5-
import java.util.HashSet;
66
import java.util.List;
7-
import java.util.stream.Collectors;
87

98
/**
109
* 1. 计数
@@ -23,6 +22,9 @@
2322
* <p>
2423
* 5. 连接字符串
2524
* Collectors.joining
25+
* <p>
26+
* 6. 一般归约
27+
* Collectors.reducing
2628
*
2729
* @author biezhi
2830
* @date 2018/3/2
@@ -31,7 +33,6 @@ public class Example1 {
3133

3234
public static void main(String[] args) {
3335
List<Project> projects = Project.buildData();
34-
projects.stream().collect(HashSet::new, HashSet::add, HashSet::addAll);
35-
projects.stream().collect(Collectors.toSet());
36+
3637
}
3738
}

java8-stream/src/main/java/io/github/biezhi/java8/stream/lesson3/Example2.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.biezhi.java8.stream.lesson3;
22

33
import io.github.biezhi.java8.stream.Project;
4+
import static java.util.stream.Collectors.*;
45

56
import java.util.List;
67

java8-stream/src/main/java/io/github/biezhi/java8/stream/lesson3/Example3.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
import io.github.biezhi.java8.stream.Project;
44

5-
import java.util.Comparator;
65
import java.util.List;
7-
import java.util.stream.Collectors;
6+
import static java.util.stream.Collectors.*;
87

98
/**
10-
* 使用分组区分前端和后端项目
9+
* 根据作者名进行分组
1110
* <p>
1211
* Collectors.groupingBy
1312
* <p>
14-
* 然后根据作者姓名再做一次分组
13+
* 然后根据编程语言类型做前后端分组
1514
*
1615
* @author biezhi
1716
* @date 2018/3/2
@@ -20,13 +19,6 @@ public class Example3 {
2019

2120
public static void main(String[] args) {
2221
List<Project> projects = Project.buildData();
23-
System.out.println(projects.stream().collect(
24-
Collectors.groupingBy(p -> {
25-
if (p.getLanguage().equalsIgnoreCase("java")
26-
|| p.getLanguage().equalsIgnoreCase("python")) {
27-
return "后端";
28-
}
29-
return "前端";
30-
})));
22+
3123
}
3224
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.biezhi.java8.stream.lesson3;
2+
3+
import io.github.biezhi.java8.stream.Project;
4+
5+
import java.util.List;
6+
7+
import static java.util.stream.Collectors.*;
8+
9+
/**
10+
* 数据分区
11+
* <p>
12+
* Collectors.partitioningBy
13+
* <p>
14+
* 根据前后端将项目分为两组
15+
*
16+
* @author biezhi
17+
* @date 2018/3/2
18+
*/
19+
public class Example4 {
20+
21+
public static boolean isBackEnd(Project project){
22+
return "java".equalsIgnoreCase(project.getLanguage()) || "python".equalsIgnoreCase(project.getLanguage());
23+
}
24+
25+
public static void main(String[] args) {
26+
List<Project> projects = Project.buildData();
27+
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.biezhi.java8.stream.lesson3;
2+
3+
import io.github.biezhi.java8.stream.Project;
4+
5+
import java.util.List;
6+
7+
/**
8+
* 转换类型
9+
* <p>
10+
* Collectors.toCollection
11+
* <p>
12+
* Collectors.collectingAndThen
13+
* <p>
14+
* Collectors.maxBy
15+
* <p>
16+
* Collectors.minBy
17+
* <p>
18+
* 按照作者名称筛选出每组star最高的项目
19+
*
20+
* @author biezhi
21+
* @date 2018/3/2
22+
*/
23+
public class Example5 {
24+
25+
public static void main(String[] args) {
26+
List<Project> projects = Project.buildData();
27+
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.biezhi.java8.stream.lesson3;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* 并行流
7+
*
8+
* @author biezhi
9+
* @date 2018/3/2
10+
*/
11+
public class Example6 {
12+
13+
public static void main(String[] args) {
14+
Arrays.asList("a1", "a2", "b1", "c2", "c1")
15+
.parallelStream()
16+
.filter(s -> {
17+
System.out.format("filter: %s [%s]\n",
18+
s, Thread.currentThread().getName());
19+
return true;
20+
})
21+
.map(s -> {
22+
System.out.format("map: %s [%s]\n",
23+
s, Thread.currentThread().getName());
24+
return s.toUpperCase();
25+
})
26+
.forEach(s -> System.out.format("forEach: %s [%s]\n",
27+
s, Thread.currentThread().getName()));
28+
}
29+
}
Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package io.github.biezhi.java8.stream.lesson3;
22

3-
import lombok.AllArgsConstructor;
4-
5-
import java.util.stream.Stream;
6-
73
/**
84
*
95
*
@@ -12,19 +8,6 @@
128
*/
139
public class Quiz1 {
1410

15-
@AllArgsConstructor
16-
static class Tuple{
17-
int first;
18-
int second;
19-
}
2011

21-
public static void main(String[] args) {
22-
// tuple = (0, 1)
23-
// next [0] = prev tuple [1]
24-
// next [1] = prev (tuple [0] + tuple[1])
25-
Stream.iterate(new Tuple(0, 1), tuple -> new Tuple(tuple.second, tuple.first + tuple.second))
26-
.limit(20)
27-
.forEach(tuple -> System.out.println("("+ tuple.first +","+ tuple.second +")"));
28-
}
2912

3013
}

0 commit comments

Comments
 (0)