JDK8新特性(五)之Stream流介绍和获取方式

1.Stream流介绍

当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。我们来体验集合操作数据的弊端,需求如下:

一个ArrayList集合中存储有以下数据:张无忌、周芷若、赵敏、张三丰
需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
import java.util.ArrayList;
import java.util.Collections;

public class Demo {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张三丰");

        // 1.拿到所有姓张的
        ArrayList<String> zhangList = new ArrayList<>();
        for (String name : list) {
            if (name.startsWith("张")) {
                zhangList.add(name);
            }
        }

        // 2.拿到名字长度为3个字的
        ArrayList<String> threeList = new ArrayList<>();
        for (String name : zhangList) {
            if (name.length() == 3) {
                threeList.add(name);
            }
        }

        // 3.打印这些数据
        for (String name : threeList) {
            System.out.println(name);
        }
    }
}

通过上述示例代码,可用看到集合操作数据的弊端:为每个需求都要循环一次,还要搞一个新集合来装数据,非常麻烦。因此在JDK1.8的时候特出了一个新特性:Stream流。Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工序,在流水线上,通过多个工序让一个原材料加工成一个商品。如果使用JDK1.8的Stream流处理上述需求,其示例代码为:

import java.util.ArrayList;
import java.util.Collections;

public class Demo {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张三丰");

        list.stream().filter((s)->{
            return s.startsWith("张");
        }).filter((s)->{
            return s.length() == 3;
        }).forEach((s)->{
            System.out.println(s);
        });
    }
}

执行上述代码,其输出结果为:

张无忌
张三丰

2.获取Stream流的两种方式

第一种:根据Colllection获取流

java.util.Collection接口中加入了default方法stream用来获取流,所有其实现类均可获取流。

public interface Collection{
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
}
import java.util.*;
import java.util.stream.Stream;

public class Demo {

    public static void main(String[] args) {
        // 方式一:根据Collection获取流
        // Collection接口中有一个默认的方法:default Stream<E> stream()
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();

        Set<String> set = new HashSet<>();
        Stream<String> stream2 =set.stream();

        Map<String,String> map = new HashMap<>();
        Stream<String> stream3=map.keySet().stream();
        Stream<String> stream4=map.values().stream();
        Stream<Map.Entry<String,String>> stream5 = map.entrySet().stream();
    }
}

 第二种:Stream中的静态方法of获取流

由于数组对象不可能添加默认方法,所以Stream接口提供了静态方法of,使用很简单: 

import java.util.stream.Stream;

public class Demo {

    public static void main(String[] args) {
        // 方式二:Stream中的静态方法of获取流
        // static<T> Stream<T> of(T... values)
        Stream<String> stream6=Stream.of("aa","bb","cc");

        String[] strs ={"aa","bb","cc"};
        Stream<String> stream7 = Stream.of(strs);

        // 基本类型的数组,是不行的,Stream会将整个数组看做一个元素进行操作
        int[] arr ={11,22,33};
        Stream<int[]> stream8=Stream.of(arr);
    }
}

备注:of方法的参数其实是一个可变参数,所以支持数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值