java8的stream_java8中Stream的使用示例教程

前言

Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。

本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧

1. 原理

Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。

原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;

高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如:

所有元素求和

过滤掉长度大于 10 的字符串

获取每个字符串的首字母

Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

而和迭代器又不同的是,Stream 可以并行化操作

Stream 的另外一大特点是,数据源本身可以是无限的

2.使用步骤

获取一个数据源(source)→ 数据转换→执行操作获取想要的结果

每次转换原有 Stream 对象不改变,返回一个新的 Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示。

3e10baa3fdb5ea9a1088da2dace209ad.png

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));

}

结果

a

b

c

23

abc

efg

1

2

3

3

1.0

2.0

3.0

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);

}

结果

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());

}

输出

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);

}

输出

[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, 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, 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

1

2

3

10.并发

public void test5_pa() {

IntStream.rangeClosed(1, 10).parallel().forEach(System.out::println);

}

输出

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());

}

结果

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));

}

结果

<<<<<<

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);

}

结果

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);

}

输出

[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);

}

输出

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));

}

输出

*

*/

/**

//

2018/10/24

21:40

=

@author:

@date:

@description:

class

getname()

int

name)

参考

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值