stream

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


未完待续!学习中,只是笔记 记录学习

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值