java8 Stream流

Srteam的操作种类

  1. 中间操作
    • 当数据源中的数据上了流水线后,在这个过程中对数据进行的所有操作都被称为“中间操作”
    • 中间操作仍然会返回一个流对象,多个中间操作串起来可以形成一个中间操作
    • Stream提供了多种流操作,例如:filter,distinct,map,sorted等操作
  2. 终端操作
    • 当所有中间操作完成后,如果要将数据从流水线上拿出来,则需要执行终端操作
    • stream对于终端操作,可以直接提供一个中间操作结果,或者将数据转化为特定的colelction,array,String等

stream特点

  1. 只能遍历一次: 数据流从一头获取数据源,在流水线上经过一系列中间操作依次对元素进行操作,当元素通过流水线后就无法对数据进行操作,可以重新在数据源获取一个新的数据流进行操作。
  2. 采用内部迭代方式:对collection进行处理,一般会使用Iterator遍历器进行遍历,这是一种外部迭代;对处理Stream流,只需要声明处理方式,处理过程由流对象自行完成,是一种内部迭代方式。对于大量数据的迭代处理过程中,内部迭代比外部迭代更加高效。

Stream相对于collection的优点

  • 无存储:流并不存储值;流的元素自数据源通过一系列计算步骤得到
  • 函数式风格:对流的操作会产生一个结果,但流的数据源不会修改
  • 惰性求值:多流操作(包括过滤、映射、排序、去重)都可以以惰性方式实现。可以使我们用一遍遍历操作就可以完成整个流水线操作,并可以使用短路操作提供更高效的实现
  • 无需上限:在开发过程中,不大好问题都可以表达为无限流(infinite stream):用户不停地读取流直到满意结果出现位置;集合是有限的,但流可以表达为无限流
  • 代码简练: 对于一些collection的Iterator操作,使用stream流可以使得代码更为简练,如果使用传统的Iterator进行遍历操作,可能会使得代码难以阅读,可维护性变差

Stream流应用

  • 映射
public class TestStream {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        List<Integer> result = list.stream()
                .mapToInt(x -> x)
                .map(x -> ++x)
                .boxed()
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(result);
    }
}
  • 过滤
public class TestStream {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(8);
        list.add(0);
        list.add(2);
        list.add(1);
        List<Integer> result = list.stream()
                .mapToInt(x -> x)
                .filter(x -> x>2)
                .boxed()
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(result);
    }
}
  • 自然排序
public class TestStream {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(8);
        list.add(0);
        list.add(2);
        list.add(1);
        List<Integer> result = list.stream()
                .mapToInt(x -> x)
                .sorted()
                .boxed()
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(result);
    }
}
  • 规约统计
public class TestStream {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(8);
        list.add(0);
        list.add(2);
        list.add(1);
        int max = list.stream()
                .mapToInt(x -> x)
                .max()
                .getAsInt();
        System.out.println(max);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heromps

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值