阅读目录
1. 原理
2.使用步骤
3. Stream的构造
4. Stream的转换
5.一个 Stream 只可以使用一次
6.转换大写
7.平方
8.找偶数
9. 区间值
10.并发
11. 新的Stream继续操作
12. Optional
13. 字符串拼接、最值、求和、过滤
14. limit, skip
15.找出最长一行的长度
16.找出全文的单词,转小写,并排序
参考
回到顶部
1. 原理
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。
原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;
高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如:
所有元素求和
过滤掉长度大于 10 的字符串
获取每个字符串的首字母
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。
而和迭代器又不同的是,Stream 可以并行化操作
Stream 的另外一大特点是,数据源本身可以是无限的
回到顶部
2.使用步骤
获取一个数据源(source)→ 数据转换→执行操作获取想要的结果
每次转换原有 Stream 对象不改变,返回一个新的 Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示。
回到顶部
3. Stream的构造
复制代码
public void test4() {
Stream stream = Stream.of("a", "b", "c", 23);
stream.forEach(key -> System.out.println(key));
String[] array = new String[]{"abc", "efg"};
stream = Stream.of(array);
stream = Arrays.stream(array);
stream.forEach(key -> System.out.println(key));
List
list = Arrays.asList(array);
stream = list.stream();
//IntStream、LongStream、DoubleStream
IntStream stream2 = IntStream.of(1, 2, 3, 3);
DoubleStream stream4 = DoubleStream.of(1, 2, 3, 3.4);
stream2.forEach(key -> System.out.println(key));
stream4.forEach(key -> System.out.println(key));
}
复制代码
结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a
b
c
23
abc
efg
1
2
3
3
1.0
2.0
3.0
3.4
回到顶部
4. Stream的转换
复制代码
public void test6() {
Stream stream = Stream.of("abc", "def");
String[] array = (String[])stream.toArray(String[]::new);
System.out.println(array.length);
List list = (List)Stream.of("1", "2", "3").collect(Collectors.toList());
String str = Stream.of("abc", "mn").collect(Collectors.joining()).toString();
System.out.println(array);
System.out.println(list);
System.out.println(str);
}
复制代码
结果
1
2
3
4
2
[Ljava.lang.String;@17f052a3
[1, 2, 3]
abcmn
回到顶部
5.一个 Stream 只可以使用一次
复制代码
public void test6_5() {
Stream stream = Stream.of(1, 2, 3, 2);
System.out.println("count:" + stream.count());
System.out.println("count:" + stream.count());
}
复制代码
输出
1
2
3
4
5
6
7
8
9
10
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.(AbstractPipeline.java:203)
at java.util.stream.LongPipeline.(LongPipeline.java:91)
at java.util.stream.LongPipeline$StatelessOp.(LongPipeline.java:572)
at java.util.stream.ReferencePipeline$5.(ReferencePipeline.java:221)
at java.util.stream.ReferencePipeline.mapToLong(ReferencePipeline.java:220)
at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
at streamTest.StreamTest.test6_5(StreamTest.java:68)
at streamTest.StreamTest.main(StreamTest.java:181)
count:4
回到顶部
6.转换大写
复制代码
public void test7() {
List list = Arrays.asList("a", "MnM");
List result = list.stream().
map(String::toUpperCase).
collect(Collectors.toList());
System.out.println(list);
System.out.println(result);
}
复制代码
输出
1
2
[a, MnM]
[A, MNM]
回到顶部
7.平方
复制代码
public void test8() {
List list2 = Arrays.asList(1, 2, 4);
List list3 = list2.stream().
map(key -> key * key).
collect(Collectors.toList());
System.out.println(list2);
System.out.println(list3);
}
复制代码
输出
1
2
[1, 2, 4]
[1, 4, 16]
回到顶部
8.找偶数
复制代码
public void test8_5() {
List list2 = Arrays.asList(1, 2, 4);
List list3 = list2.stream().
filter(key -> key % 2 == 0).
collect(Collectors.toList());
System.out.println(list2);
System.out.println(list3);
}
复制代码
输出
1
2
[1, 2, 4]
[2, 4]
回到顶部
9. 区间值
复制代码
public void test5() {
System.out.println("\n");
IntStream.range(1, 3).forEach(System.out::println);
System.out.println("\n");
IntStream.rangeClosed(1, 3).forEach(System.out::println);
}
复制代码
结果
1
2
3
4
5
6
7
1
2
1
2
3
回到顶部
10.并发
复制代码
public void test5_pa() {
IntStream.rangeClosed(1, 10).parallel().forEach(System.out::println);
}
复制代码
输出
1
2
3
4
5
6
7
8
9
10
3
7
1
5
2
8
10
6
9
4
是否并发思考
回到顶部
11. 新的Stream继续操作
复制代码
public void test6_6() {
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
}
复制代码
结果
1
2
3
4
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR
回到顶部
12. Optional
复制代码
public static void print(String text) {
System.out.println("<<<<<<");
System.out.println(Optional.ofNullable(text));
List obj = new ArrayList<>();
Optional.ofNullable(text).ifPresent(System.out::println);
System.out.println(">>>>>>>>>>>>\n");
}
public static int getLength(String text) {
return Optional.ofNullable(text).map(String::length).orElse(-1);
}
public void test14() {
String strA = " abcd ", strB = null;
print(strA);
print("");
print(strB);
System.out.println(getLength(strA));
System.out.println(getLength(""));
System.out.println(getLength(strB));
}
复制代码
结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<<<<<<
Optional[ abcd ]
abcd
>>>>>>>>>>>>
<<<<<<
Optional[]
>>>>>>>>>>>>
<<<<<<
Optional.empty
>>>>>>>>>>>>
6
0
-1
回到顶部
13. 字符串拼接、最值、求和、过滤
复制代码
public void test15() {
String concat = Stream.of("A", "B", "C").reduce("", String::concat);
System.out.println("concat:" + concat);
double minValue = Stream.of(-1.5, 1.0, -3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
System.out.println("min:" + minValue);
int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
System.out.println("sum1:" + sumValue);
int sumValue2 = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
System.out.println("sum2:" + sumValue2);
concat = Stream.of("a", "B", "c", "D", "e", "F").filter(x -> x.compareTo("Z") > 0).reduce("", String::concat);
System.out.println("concat:" + concat);
}
复制代码
结果
1
2
3
4
5
concat:ABC
min:-3.0
sum1:10
sum2:10
concat:ace
回到顶部
14. limit, skip
复制代码
public void test16() {
List persons = new ArrayList<>();
IntStream.range(1, 1000).forEach(key->persons.add(new Person(key, "jihite:" + key)));
List personList = persons.stream().map(Person::getName).limit(10).skip(3).collect(Collectors.toList());
System.out.println(personList);
}
复制代码
输出
1
[jihite:4, jihite:5, jihite:6, jihite:7, jihite:8, jihite:9, jihite:10]
回到顶部
15.找出最长一行的长度
复制代码
public void test19() throws IOException {
String path = "**/Person.java";
BufferedReader br = new BufferedReader(new FileReader(path));
int longest = br.lines()
.mapToInt(String::length)
.max()
.getAsInt();
br.close();
System.out.println(longest);
}
复制代码
输出
1
回到顶部
16.找出全文的单词,转小写,并排序
复制代码
public void test20() throws IOException {
String path = "**/Person.java";
BufferedReader br = new BufferedReader(new FileReader(path));
List words = br.lines()
.flatMap(line->Stream.of(line.split(" ")))
.filter(word->word.length()>0)
.map(String::toLowerCase)
.distinct()
.sorted()
.collect(Collectors.toList());
br.close();
System.out.println(words);
words.forEach(key-> System.out.println(key));
}
复制代码
输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*
*/
/**
//
2018/10/24
21:40
=
@author:
@date:
@description:
class
getname()
int
name)
https://www.cnblogs.com/kaituorensheng/p/9852462.html