java8 stream 教程_java8 Stream 流快速入门

Stream 流

简介

Java 8 中,得益于 lambda 带来的函数式编程,引入了一个全新的 Stream流 概念,用于解决集合已有的弊端。

好处

我们先来看一个例子:

筛选出 names 中以 '张' 开头的字符串得到子集1,再筛选出 子集1 中长度为 3 的字符串,然后遍历输出。

// 传统集合的方式

public static void main(String[] args) {

List names = new ArrayList<>();

names.add("张三丰");

names.add("张大宝");

names.add("张三");

names.add("德玛杰");

names.add("乔峰");

names.add("李大宝");

List list1 = new ArrayList<>(); //以 '张' 开头的字符串

for (String name:names){

if (name.startsWith("张")){

list1.add(name);

}

}

List list2 = new ArrayList<>(); // list1中长度为 3 的字符串

for (String name:list1){

if (name.length()==3){

list2.add(name);

}

}

for (String name:list2){

System.out.println(name);

}

}

复制代码// stream流方式

public static void main(String[] args) {

List names = new ArrayList<>();

names.add("张三丰");

names.add("张大宝");

names.add("张三");

names.add("德玛杰");

names.add("乔峰");

names.add("李大宝");

names.stream().filter(name->name.startsWith("张"))

.filter(name->name.length()==3).forEach(System.out::println);

}

复制代码

可以看到用 stream 流方式比传统集合的方式精简了很多。

获取流的两种方式

所有的 Collection 集合可以通过 stream() 方法获取流.

Stream 类的静态方法 of() 通常用于将数组转成 stream 流。

public static void main(String[] args) {

// 集合转成 stream 流

List list = new ArrayList<>();

Stream listStream = list.stream();

Set set = new HashSet<>();

Stream setStream = set.stream();

// 数组转成 stream 流

String[] names = new String[]{"zs","ls","ww"};

Stream namesStream = Stream.of(names);

Stream integerStream = Stream.of(1, 2, 3, 4, 5);

}

复制代码

方法分类

stream 流中方法分为两类:

延迟方法,返回值仍是 Stream 类型

终结方法,返回值不再是 Stream 类型,例如: count() 和 forEach()。

常用方法--fliter()

filter() 将一个流转换成另外一个子流,该方法接受一个 Predicate 类型的参数(系统内置函数接口之一)。

Stream filter(Predicate super T> predicate);

public static void main(String[] args) {

List names = new ArrayList<>();

names.add("张三丰");

names.add("张大宝");

names.add("张三");

names.add("德玛杰");

names.add("乔峰");

names.add("李大宝");

// 过滤 names 集合,只要姓张的人,然后输出

names.stream().filter(name->name.startsWith("张")).

forEach(System.out::println);

}

复制代码

Stream流特点--只能使用一次

Stream 流属于管道流,只能被使用一次,当一个 Stream 流调用了终结方法后,就会被关闭,再次调用其方法会报错。

public static void main(String[] args) {

// 数组转成 stream 流

String[] names = new String[]{"zsf","ls","ww"};

Stream namesStream = Stream.of(names);

namesStream.filter(name->name.length()==3).

forEach(System.out::println);

// 流已经被关闭,再次调用

namesStream.forEach(System.out::println);

}

复制代码

15f0ebb4fcc3f91f5ccf74d0a21d2fcd.png

常用方法--map()

如果需要将流中的元素映射到另一个流中,可以用 map() 方法,一般用于将一种类型的数据转成另一种类型的数据。

Stream map(Function super T, ? extends R> mapper);

复制代码public static void main(String[] args) {

// 数组转成 stream 流

String[] strings = new String[]{"1","2","3"};

Stream stream1 = Stream.of(strings);

// 使用 map 方法,将字符串类型的整数转成 Integer 类型的整数,然后遍历

Stream stream2 = stream1.map(k->Integer.parseInt(k));

stream2.forEach(System.out::println);

}

复制代码

常用方法--limit()

limit() 可以对流中的元素进行截取,只截取前 n 个

public static void main(String[] args) {

// 数组转成 stream 流

String[] strings = new String[]{"1","2","3","4"};

// 只截取前3个元素,输出

Stream.of(strings).limit(3).forEach(System.out::println);

}

复制代码

常用方法--skip()

跳过流中的前 n 个元素,如果 n 大于流中元素的个数,返回一个长度为 0 的流。

public static void main(String[] args) {

// 数组转成 stream 流

String[] strings = new String[]{"1","2","3","4"};

// 跳过前2个元素,输出

Stream.of(strings).skip(2).forEach(System.out::println);

}

复制代码

常用方法--concat()

Stream 类的静态方法用于将两个流合并。

public static void main(String[] args) {

// 数组转成 stream 流

String[] strings1 = new String[]{"1","2","3","4"};

String[] strings2 = new String[]{"3","4","5","6"};

Stream stream1 = Stream.of(strings1);

Stream stream2 = Stream.of(strings2);

Stream stream3 = Stream.concat(stream1,stream2);

stream3.forEach(System.out::println); // 输出 1,2,3,4,3,4,5,6

}

复制代码

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[java8 Stream 流快速入门]http://www.zyiz.net/tech/detail-142299.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值