Java8 stream常用方法
一 .什么是stream
Stream 中文成为 “流” 通过集合转换为这么一种叫为流的元素系列,通过声明性方式,能够对集合中的每个元素进行一系列的并行或者串行的流水线操作
二.操作流
整个流操作就是一条流水线,将元素放在流水线上一个个的进行处理
其中数据源就是原始集合,然后将List 的集合转换为Stream 类型的流并对其进行一系列的流水操作,比如过滤保留部分元素、对元素进行排序、类型转换等;最后再进行一个终端操作,可以把 Stream 转换回集合类型,也可以直接对其中的各个元素进行处理,比如打印、比如计算总数、计算最大值等等
很重要的一点是,很多流操作本身就会返回一个流,所以多个操作可以直接连接起来
三.常用方法
1.filter(T->boolean)
保留boolean为true的
package tan.stream;
import tan.funtion.User;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author ASUS
* @Date 2021/6/16 14:31
* @Version 1.0
*/
public class TestStream {
public static void main(String[] args) {
User u1=new User("a",1,2);
User u3=new User("B",2,5);
User u4=new User("NN",3,4);
User u5=new User("y",4,6);
User u2=new User("w",5,9);
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
list=list.stream().filter(t-> t.getAge() > 2 )//判断age大于2的保留
.collect(Collectors.toList());//转为list
list.stream().forEach(System.out::println);//forEach打印
}
}
//结果
User(name=w, age=5, id=9)
User(name=NN, age=3, id=4)
User(name=y, age=4, id=6)
2.limit(Long n)返回前几个元素
3.sorted() / sorted((T, T) -> int)
如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如 Stream
反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口
4.distinct()
去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的
如例子中的 Person 类,需要先定义好 equals 方法,不然类似[Person{name=‘jack’, age=20}, Person{name=‘jack’, age=20}]这样的情况是不会处理的
package tan.stream;
import tan.funtion.User;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author ASUS
* @Date 2021/6/16 14:31
* @Version 1.0
*/
public class TestStream {
public static void main(String[] args) {
User u1=new User("a",1,2);
User u3=new User("B",2,5);
User u4=new User("NN",3,4);
User u5=new User("y",4,6);
User u2=new User("w",5,9);
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
list=list.stream()
//.sorted(Comparator.comparingInt(User::getAge))//简写
.sorted((a,b)->b.getAge()-a.getAge())//按年龄排序
.limit(3)//去前三位
.collect(Collectors.toList());//转集合
list.stream().forEach(System.out::println);
}
}
//结果
User(name=w, age=5, id=9)
User(name=y, age=4, id=6)
User(name=NN, age=3, id=4)
5.skip(long n)
去掉前几个元素
tips:
- 用在 limit(n) 前面时,先去除前 m 个元素再返回剩余元素的前 n 个元素
- limit(n) 用在 skip(m) 前面时,先返回前 n 个元素再在剩余的 n 个元素中去除 m 个元素
map(T->R)
将流中的T元素映射为R(类型转换)
public static void main(String[] args) {
User u1=new User("a",1,2);
User u3=new User("B",2,5);
User u4=new User("NN",3,4);
User u5=new User("y",4,6);
User u2=new User("w",5,9);
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
List alist=new ArrayList<>();
alist=list.stream()
.map(User::getAge)
.collect(Collectors.toList());
alist.stream().forEach(System.out::println);
}
结果
1
5
2
3
4
6.flatMap(T -> Stream)
将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流
List<String> list = new ArrayList<>();
list.add("aaa bbb ccc");
list.add("ddd eee fff");
list.add("ggg hhh iii");
list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(toList());
上面例子中,我们的目的是把 List 中每个字符串元素以" "分割开,变成一个新的 List。
首先 map 方法分割每个字符串元素,但此时流的类型为 Stream<String[ ]>,因为 split 方法返回的是 String[ ] 类型;所以我们需要使用 flatMap 方法,先使用Arrays::stream将每个 String[ ] 元素变成一个 Stream 流,然后 flatMap 会将每一个流连接成为一个流,最终返回我们需要的 Stream
7.anyMatch(T->Boolean)
流中是否有一个元素匹配给定的 T -> boolean
条件
boolean b=list.stream()
.anyMatch(p ->p.getId()==2);
b==true
allMatch(T -> boolean)//全部满足
noneMatch(T -> boolean)//没有满足的
findAny() 和 findFirst()//找到其中的一个元素和找到第一个元素 这两个方法返回的是一个 Optional 对象,它是一个容器类,能代表一个值存在或不存在
8.reduce
Integer reduce = list.stream()
.map(User::getAge)
.reduce(0, (a, b) -> a + b);
System.out.println(reduce);
reduce 第一个参数 0 代表起始值为 0,lambda (a, b) -> a + b 即将两值相加产生一个新值
9.count()
返回流中元素个数 结果为long类型
10.collect()
.collect(Collectors.toList());//转集合
11.forEach()
alist.stream().forEach(System.out::println);
12joining()
joining(",")
也是一个比较常用的方法,对流里面的字符串元素进行连接,其底层实现用的是专门用于字符串连接的 StringBuilder
未完待续!学习中,只是笔记 记录学习