1 package day14.lesson2;
2
3 import java.util.ArrayList;
4 import java.util.stream.Stream;
5
6 /*
7 2.3 Stream流的"中间操作"方法
8
9 中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作
10
11 Stream filter(Predicate predicate) 用于对流中的数据进行过滤
12
13 Stream limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
14 Stream skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
15
16 static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流
17 Stream distinct() 返回由该流的不同元素(根据Object.equals(Object))组成的流
18
19 Stream sorted() 返回由此流的元素组成的流,根据自然顺序排序
20 Stream sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序
21
22 Stream map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流
23 IntStream mapToInt(ToIntFunction mapper) 返回一个IntStream其中包含将给定函数应用于此流的元素的结果
24 */
25 public class Demo3Stream {
26 public static void main(String[] args) {
27 // test1();
28 // test2();
29 // test3();
30 // test4();
31 test5();
32 }
33
34 private static void test1(){
35 ArrayList<String> arrayList = new ArrayList<>();
36 arrayList.add("林青霞");
37 arrayList.add("张曼玉");
38 arrayList.add("王祖贤");
39 arrayList.add("柳岩");
40 arrayList.add("张敏");
41 arrayList.add("张无忌");
42
43 //需求1:输出集合中以张开头的元素
44 /*arrayList.stream().filter((String s) -> {
45 return s.startsWith("张");
46 }).forEach(System.out::println);*/
47 arrayList.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
48 System.out.println();
49
50 //需求2:输出集合中长度为3的元素
51 arrayList.stream().filter(s -> s.length()==3).forEach(System.out::println);
52 System.out.println();
53
54 //需求3:输出集合中以张开头且长度为3的元素
55 arrayList.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
56
57 /*
58 张曼玉
59 张敏
60 张无忌
61
62 林青霞
63 张曼玉
64 王祖贤
65 张无忌
66
67 张曼玉
68 张无忌
69 */
70 }
71
72 private static void test2(){
73 ArrayList<String> arrayList = new ArrayList<>();
74 arrayList.add("林青霞");
75 arrayList.add("张曼玉");
76 arrayList.add("王祖贤");
77 arrayList.add("柳岩");
78 arrayList.add("张敏");
79 arrayList.add("张无忌");
80
81 //需求1:输出前3个元素
82 arrayList.stream().limit(3).forEach(System.out::println);
83 System.out.println();
84
85 //需求2:跳过前3个元素,输出剩余元素
86 arrayList.stream().skip(3).forEach(System.out::println);
87 System.out.println();
88
89 //需求3:跳过前2个元素,输出剩余元素的前两个
90 arrayList.stream().skip(2).limit(2).forEach(System.out::println);
91
92 /*
93 林青霞
94 张曼玉
95 王祖贤
96
97 柳岩
98 张敏
99 张无忌
100
101 王祖贤
102 柳岩
103 */
104 }
105
106 private static void test3(){
107 ArrayList<String> arrayList = new ArrayList<>();
108 arrayList.add("林青霞");
109 arrayList.add("张曼玉");
110 arrayList.add("王祖贤");
111 arrayList.add("柳岩");
112 arrayList.add("张敏");
113 arrayList.add("张无忌");
114
115 //需求1:取前4个元素组成一个流
116 Stream<String> s1 = arrayList.stream().limit(4);
117
118 //需求2:跳过前2个元素,其余元素组成一个流
119 Stream<String> s2 = arrayList.stream().skip(2);
120
121 //需求3:合并需求1和需求2得到的流,并输出
122 // Stream.concat(s1, s2).forEach(System.out::println);
123 /*
124 林青霞
125 张曼玉
126 王祖贤
127 柳岩
128 王祖贤
129 柳岩
130 张敏
131 张无忌
132 */
133
134 //需求4:合并需求1和需求2得到的流,并输出,要求字符串元素不能重复
135 Stream.concat(s1, s2).distinct().forEach(System.out::println);
136 /*
137 林青霞
138 张曼玉
139 王祖贤
140 柳岩
141 张敏
142 张无忌
143 */
144 }
145
146 private static void test4(){
147 ArrayList<String> arrayList = new ArrayList<>();
148 arrayList.add("lingqingxia");
149 arrayList.add("zhangmanyu");
150 arrayList.add("wangzuxian");
151 arrayList.add("liuyan");
152 arrayList.add("zhangmin");
153 arrayList.add("zhangwuji");
154
155 //需求1:按照字母顺序输出集合数据
156 // arrayList.stream().sorted().forEach(System.out::println);
157 /*
158 lingqingxia
159 liuyan
160 wangzuxian
161 zhangmanyu
162 zhangmin
163 zhangwuji
164 */
165
166 //需求2:按照字符串长度输出集合数据
167 // arrayList.stream().sorted((s1, s2) -> s1.length()-s2.length()).forEach(System.out::println);
168 /*
169 liuyan
170 zhangmin
171 zhangwuji
172 zhangmanyu
173 wangzuxian
174 lingqingxia
175 */
176
177 arrayList.stream().sorted((s1, s2) -> {
178 int num = s1.length() - s2.length();
179 int num2 = (num==0) ? s1.compareTo(s2) : num;
180 return num2;
181 }).forEach(System.out::println);
182 /*
183 liuyan
184 zhangmin
185 zhangwuji
186 wangzuxian
187 zhangmanyu
188 lingqingxia
189 */
190 }
191
192 private static void test5(){
193 ArrayList<String> arrayList = new ArrayList<>();
194 arrayList.add("10");
195 arrayList.add("20");
196 arrayList.add("30");
197 arrayList.add("40");
198 arrayList.add("50");
199
200 //需求:将集合中的字符串元素转换为整数,并输出
201 // arrayList.stream().map(s -> Integer.parseInt(s)).forEach(System.out::println); //Lambda
202 // arrayList.stream().map(Integer::parseInt).forEach(System.out::println); //函数引用
203
204 arrayList.stream().mapToInt(Integer::parseInt).forEach(System.out::println); //效果同上
205
206 //int sum() 返回此流中元素的总和
207 int result = arrayList.stream().mapToInt(Integer::parseInt).sum();
208 System.out.println(result);
209
210 /*
211 10
212 20
213 30
214 40
215 50
216 150
217 */
218 }
219 }