Java-Stream流综合练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
StreamTest:

package com.fluffysponge;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* 现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作:
* 1.男演员只要名字为3个字的前三人
* 2.女演员只要姓林的,并且不要第一个
* 3.把过滤后的男演员姓名和女演员姓名合并到一起
* 4.把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
* 演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法
*/

/*
* Stream流的收集方法
* R collect (Collector collector)
* 它是通过工具类Collectors提供了具体的收集方式
* public static <T> Collector toList():把元素收集到List集合中
* public static <T> Collector toSet():把元素收集到Set集合中
* public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中
* */

public class StreamTest {
public static void main(String[] args) {
//创建集合
ArrayList<String> manList = new ArrayList<>();
manList.add("周润发");
manList.add("成龙");
manList.add("刘德华");
manList.add("吴京");
manList.add("周星驰");
manList.add("李连杰");

ArrayList<String> womanList = new ArrayList<>();
womanList.add("林心如");
womanList.add("张曼玉");
womanList.add("林青霞");
womanList.add("柳岩");
womanList.add("林志玲");
womanList.add("王祖贤");

// //男演员只要名字为3个字的前三人
// Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);
//
// //女演员只要姓林的,并且不要第一个
// Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
//
// //把过滤后的男演员姓名和女演员姓名合并到一起
// Stream<String> stream = Stream.concat(manStream, womanStream);
//
// //把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
//// stream.map(Actor::new).forEach(System.out::println);
// stream.map(Actor::new).forEach(p -> System.out.println(p.getName()));

Stream.concat(manList.stream().filter(s->s.length() == 3).limit(3),
womanList.stream().filter(s->s.startsWith("林")).skip(1)).
map(Actor::new).
forEach(p -> System.out.println(p.getName()));

System.out.println("--------");
//////////////////////////////////////////////////////////////////////////////////////////

//Stream 收集功能

//创建List对象,这个直接使用上面已有的
//需求1: 得到名字为3个字的流
Stream<String> manListStream = manList.stream().filter(s -> s.length() == 3);

//需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
List<String> names = manListStream.collect(Collectors.toList());
for(String name :names){
System.out.println(name);
}
System.out.println("--------");

//创建Set集合对象
Set<Integer> set = new HashSet<>();
set.add(10);
set.add(20);
set.add(30);
set.add(33);
set.add(35);

//需求3:得到年龄大于25的流
Stream<Integer> setStream = set.stream().filter(age -> age > 25);
//需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
Set<Integer> ages = setStream.collect(Collectors.toSet());
for(Integer age :ages){
System.out.println(age);
}
System.out.println("--------");

//定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
String[] strArray = {"林青霞,30","张曼玉,35","王祖贤,33","柳岩,25"};
//需求5:得到字符串中年龄数据大于28的流
Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);

//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
Set<String> keySet = map.keySet();
for(String key : keySet){
Integer value = map.get(key);
System.out.println(key + "," + value);
}
}
}



Actor:

package com.fluffysponge;
/*
* 演员类
* */
public class Actor {
private String name;

public Actor() {
}

public Actor(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}