java之Stream流

一、好处

1.直接阅读代码的字面意思  即可完美展示无关逻辑方式的语义: 获取流、 过滤姓张、 过滤长度为3、逐一打印

2.Stream流把真正的函数式编程风格引入到Java中

3.代码简洁

 

看下面的案例即可明白 

创建一个集合,存储多个字符串元素

把集合中所有以"张"开头的元素存储到一个新的集合

把"张"开头的集合中的长度为3的元素存储到一个新的集合

遍历上一步得到的集合

A.普通方式:

B.使用Stream流之后: 

一行代码就解决。 

总的来说 

Java的Stream流使得集合数组操作更为方便、直观,同时提高了代码的可读性和可维护性。

 注意:

在Java中,使用Stream API进行流操作时,原始集合或数组中的数据不会被修改。Stream操作返回一个新的流或集合,而原始数据集保持不变。流操作本身是非破坏性的,这意味着你可以安全地对集合进行操作而不会影响到原始数据。

二、思想 

 

通过上面的思维导入, Stream流有三种方法:

1.获取流

2.对流的中间操作

3.对流的终结操作

三、获取Stream流

获取Stream流的意思就是:创建一条流水线,并把数据放到流水线上准备进行操作  

 

用法示例: 

public class StreamDemo {
    public static void main(String[] args) {
        //Collection体系的集合可以使用默认方法stream()生成流
        List<String> list = new ArrayList<String>();
        Stream<String> listStream = list.stream();

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

        //Map体系的集合间接的生成流
        Map<String,Integer> map = new HashMap<String, Integer>();
        Stream<String> keyStream = map.keySet().stream();
        Stream<Integer> valueStream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

        //数组可以通过Arrays中的静态方法stream生成流
        String[] strArray = {"hello","world","java"};
        Stream<String> strArrayStream = Arrays.stream(strArray);
      
      	//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
        Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
        Stream<Integer> intStream = Stream.of(10, 20, 30);
    }
}

四、中间操作  

中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作  

 

用法示例:

        ArrayList<String> strings = new ArrayList<>();
        Collections.addAll(strings, "a", "b", "c", "d","d", "e", "f", "g", "h");
        //过滤  输出d d
        strings.stream().filter(m -> m.startsWith("d")).forEach(System.out::println);

        //获取前面几个元素  输出a b c
        strings.stream().limit(3).forEach(System.out::println);

        //跳过前面几个元素  输出d d e f g h
        strings.stream().skip(3).forEach(System.out::println);

        //元素去重  输出a b c d e f g h
        strings.stream().distinct().forEach(System.out::println);

        //合并两个流 工具类用法
        //输出a b c d d e f g h a b c d d e f g h
        Stream.concat(strings.stream(),strings.stream()).forEach(System.out::println);

转换流中的数据类型

 //转换流中的数据类型
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三-11","李四-12","王麻子-13","刘婷婷-14");
//匿名内部类写法
list.stream().map(new Function<String, Integer>(){
    @Override
    public Integer apply(String s) {
            String[] arr = s.split("-");
            String ageString = arr[1];
            return Integer.parseInt(ageString);
        }
    }).forEach(System.out::println);    //11 12 13 14
System.out.println("-----------------------------------------------------");
//函数式接口方法
list.stream()
        .map(s -> Integer.parseInt(s.split("-")[1]))
        .forEach(System.out::println);//11 12 13 14

五、 终结操作

 终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

终结方法不再返回Stream流,链式操作到终结方法就不能用(.方法)链式操作下去了。 

 

遍历和统计示例: 

 

转换数组示例: 

 

六、收集操作 

收集操作就是,将Stream流中的数据放入到数组或集合中返回一个数组或集合

收集操作也是属于终结操作的一种,上面介绍了数组,这里介绍集合。 

利用工具类Collectors提供了具体的收集方式  

转化为List、Set集合的用例: 

转化为Map集合的用例子: 

A.函数式接口写法

ArrayList<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");

Map<String, Integer> map = list.stream().filter(
        s -> {
            String[] split = s.split(",");
            int age = Integer.parseInt(split[1]);
                    return age >= 24;
        })

//   collect方法只能获取到流中剩余的每一个数据.
//在底层不能创建容器,也不能把数据添加到容器当中

//Collectors.toMap 创建一个map集合并将数据添加到集合当中

// s 依次表示流中的每一个数据

//第一个lambda表达式就是如何获取到Map中的键
//第二个lambda表达式就是如何获取Map中的值
.collect(Collectors.toMap(
        s -> s.split(",")[0],
        s -> Integer.parseInt(s.split(",")[1]) ));

System.out.println(map);

B.匿名内部类写法 

 

 注意:在转化为Map集合的时候,如果键有重复,就会报错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值