Java8 Stream

Java8 Stream

什么是Stream?

Stream是java8的新特性,它允许你以声明式处理数据集合,可以把它作是遍历数据集的高级迭代器。此外与stream与lambda表达式结合后编码效率大大提高。

要澄清的是 java8 中的 stream 与 InputStream 和 OutputStream 是完全

不同的概念.

案例:

 class Apple {
    private int num;
    private String name;
    private String color;

    public Apple(int num, String name, String color) {
        this.num = num;
        this.name = name;
        this.color = color;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}



public static void main(String[] args) {
        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple(1, "草莓0", "黑色"));
        appleList.add(new Apple(444, "草莓1", "红色"));
        appleList.add(new Apple(3, "草莓4", "白色"));
        appleList.add(new Apple(45, "草莓50", "红色"));

        //我们的需求是在appleList集合中找出红色苹果手机
        //使用Stream流快速实现操作
        List<Apple> apples = appleList
            				//先转换成流
                            .stream()
            				//过滤器
                            .filter(c->c.getColor().equals("红色"))
            				//转成集合
                            .collect(Collectors.toList());

        System.out.println(apples);
 }

结果:
    [Apple{num=444, name='草莓1', color='红色'}, Apple{num=45, name='草莓50', color='红色'}]

什么是流呢?

简单地定义,就是“从支持数据处理操作的源,生成的元素序列”。

元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。

数据源:获取数据的源,比如集合。

数据处理操作:流更偏向于数据处理和计算,比如filter、map、find、sort等。

简单来说,我们通过一个集合的stream方法获取一个流,然后对流进行一系列流操作,最后再构建成我们需要的数据集合。
在这里插入图片描述

简单来说,就是:
数据源—>中间操作—>终端操作—>结果

获取流

使用 Collection 接口下的 stream()

 List<String> list = new ArrayList<>(); 
 Stream<String> stream = list.stream();

使用 Arrays 中的 stream() 方法,将数组转成流

 Integer[] nums = new Integer[10]; 
 Stream<Integer> stream = Arrays.stream(nums);

使用 Stream 中的静态方法:of()

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);

使用 BufferedReader.lines() 方法,将每行内容转成流

BufferedReader reader=new BufferedReader(new FileReader("stream.txt")); 
Stream<String> lineStream = reader.lines();

流操作

流操作可以分为两类:中间操作和终端操作。回看之前的代码:

List<Apple> apples = applestore 
	  .stream() 							   获得流
	 .filter(a -> a.getColor().equals("red")) 中间操作 
	 .collect(Collectors.toList());			  终端操作

简化一下就是:
数据源 => 中间操作 => 终端操作 => 结果
诸如 filter 或者 sort 等中间操作会返回另一个流,进而进行下一步流操作,而终 端操作则是将流关闭,构建新的数据集合对象(也可以不构建)。
中间操作
filter:过滤流中的某些元素,
sorted(): 自然排序,流中元素需实现 Comparable 接口
distinct: 去除重复元素
limit(n): 获取 n 个元素
skip(n): 跳过 n 元素,配合 limit(n)可实现分页
map(): 将其映射成一个新的元素
终端操作
forEach: 遍历流中的元素
toArray:将流中的元素倒入一个数组
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返 回 true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返 回 true,否则返回 false
findFirst:返回流中第一个元素
collect:将流中的元素倒入一个集合,Collection 或 Map

 /*
    Stream java8之后提供数据集合进行遍历操作的高级迭代器
    集合/数组——》元素序列(Stream)——》中间操作(过滤、去重,排序。。。)——》终端操作
    流的使用:1、获取流: 数组集合可以转换成流
            2、中间操作
            3、终端操作
     */

    public static void main(String[] args) {

 /*
        Integer sum =  Stream.of(1,2,3,4,5,5).reduce((o1, o2)->{return o1+o2;}).get();
        System.out.println(sum);
 */

        //遍历
        Stream.of(5,2,7,4,5,5)
                .filter(e->{return e>2;})     //把数据大于2的元素留下来
                .sorted(((o1, o2) -> o2.compareTo(o1)))       //逆序排序
                .distinct()     //去重
                .forEach(System.out::println);
        System.out.println("---------------max最大值分割线------------------");
        System.out.println("max=" + Stream.of(10, 3, 4, 5, 1, 8, 9)
                .max(((o1, o2) -> {
                    return o1.compareTo(o2);  //比较大小
                }))
                .get()
        );
        System.out.println("---------------reduce求和分割线------------------");
        Integer sum = Stream.of(10, 3, 4, 5, 1, 8, 9)
                .reduce((o1, o2) -> {
                    return o1 + o2;    //q求和
                })
                .get();
        System.out.println("和为:" + sum);
        System.out.println("---------------anyMatch分割线------------------");

        Boolean b = Stream.of(10, 3, 4, 5, 1, 8, 9)
                .anyMatch((e) -> {  // anyMath
                    return e > 4;   //只要有一个大于4就返回true,否则返回false
                });
        System.out.println(b);
        System.out.println("---------------allMatch分割线------------------");
        Boolean b1 = Stream.of(10, 3, 4, 5, 1, 8, 9)
                .allMatch((e) -> {  // allMatch
                    return e > 3;   //只要有一个不是小于等于3就返回false,否则返回true
                });
        System.out.println(b1);


    }

运行结果:
在这里插入图片描述
中间操作map 以及终端操作collect:

 /*
    stream  java8 之后对集合(集合,数组)进行遍历操作的高级迭代器(重点在于对数据操作)

    集合/数组 --> 元素序列(stream)  --> 中间操作(过滤,排序,去重...) --> 终端操作(最终的结果)

    流的使用:
    1.获取流     集合,数组  都可以转为流
    2.中间操作
    3.终端操作

     */
    public static void main(String[] args) {
        List<Apple> applestore = new ArrayList();
        applestore.add(new Apple(1, "red", 500, "河南"));
        applestore.add(new Apple(2, "red", 400, "陕西"));
        applestore.add(new Apple(3, "green", 300, "上海"));
        applestore.add(new Apple(5, "green", 200, "湖北"));
        applestore.add(new Apple(4, "green", 100, "湖南"));

   

        /*
        map(方法) 将某一个值 映射到stream中去
         */

        applestore.stream()
                .map(Apple::getId)  //只把id映射到map中去
                .forEach(System.out::println);

        List list = applestore.stream()
                .sorted(((o1, o2) -> {
                    return o1.getId() - o2.getId();
                }))
                .collect(Collectors.toList());

        System.out.println(list);


        //前提得重写equal方法,hashcode方法
        Set set = applestore.stream()
                .sorted(((o1, o2) -> {
                    return o1.getId() - o2.getId();
                }))
                .collect(Collectors.toSet());

        System.out.println(set);

        Map<Integer, String> map = applestore.stream()
                .sorted(((o1, o2) -> {
                    return o1.getId() - o2.getId();
                }))
                .collect(Collectors.toMap(Apple::getId, Apple::getAddress));

        System.out.println(map);
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入了Stream API,它是一种处理集合数据的新方式。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方式,不需要显式地编写循环,使得代码更加简洁。 3. 函数式编程:Stream API支持函数式编程风格,可以通过Lambda表达式来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的中间操作和终止操作来对集合进行处理。中间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合中。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值