Stream流操作集合和数组

  • stream的使用非常的方便
  • 可以用来操作集合和数组

首先我么来看一个代码的需求:从集合中筛选出所有姓张的人出来,并且长度为3的人

package Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class StreamDemo {
    public static void main(String[] args) {
        //从集合中筛选出所有姓张的人出来,并且长度为3的人
        List<String> lists = new ArrayList<>();
		//添加对象
        Collections.addAll(lists,"张无忌","张三丰","张三","白毛狮王","殷素素","赵敏","周芷若");

        //正常的思维方法:
        //1.遍历集合 筛选出姓张的 放到集合中
        List<String> listZhangs = new ArrayList<>();
        lists.forEach(s ->{
            if(s.startsWith("张")){
               listZhangs.add(s);
            }
        });
        //2.从姓张的集合中筛选名字长度为三的
        listZhangs.forEach(s ->{
            if(s.length() == 3){
                System.out.println(s);
            }
        });
        System.out.println("-----------------------------");
        //Stream 操作
        //filter先过滤姓张的 在过滤长度为三的  简洁高效 1行代码搞定
        lists.stream().filter(s-> s.startsWith("张")).filter(s ->s.length()==3).forEach(s -> System.out.println(s));
    }
}

在这里插入图片描述

哎呀 是不是比正常的思维的方法方便多了,一行代码就搞定了

下面介绍下 集合与数组获取流的方式:

直接上代码:

package Stream;

import java.util.*;
import java.util.stream.Stream;

public class StreamDemo02 {
    public static void main(String[] args) {
        //Stream 是来操作集合和数组
        //介绍 Collection 集合获取流的方式
        //很简单
        Collection collection = new ArrayList();
        collection.stream();

        //1.Map集合获取流的方式
        Map<String,Integer> maps = new HashMap<>();
        maps.put("你好",6);
        maps.put("hello",9);
         //先获取set集合 再用set集合获取流
        //就是先获取key键的流
        Stream<String> key = maps.keySet().stream();
        //获取值的流
        Stream<Integer> values = maps.values().stream();
        //2.同时获取键和值
        Stream<Map.Entry<String, Integer>> keyValues = maps.entrySet().stream();

          //数组获取流
        // 1.通过数组工具类 Arrays
        // 2.Stream.of(数组)
        String[] str = new String[]{"你好","欢迎","来到java世界"};
        Stream<String> strStream = Arrays.stream(str);
        Stream<String> str1Stream = Stream.of(str);
        strStream.filter(s -> s.length()==2).forEach(s-> System.out.println(s));
    }
}

这些都是非常简单的基础

下面介绍流的常用API

/*
 forEach : 逐一处理(遍历)
 count:统计个数
    -- long count();
 filter : 过滤元素
    -- Stream<T> filter(Predicate<? super T> predicate)
 limit : 取前几个元素
 skip : 跳过前几个
 map : 加工方法
 concat : 合并流
 */

这里面分终结方法和非终结方法
终结方法: foreach , count 一旦Stream调用了终结方法,流的操作就全部终结了,不能继续使用, 只能创建新的Stream操作
非终结方法:每次调用完成以后返回一个新的流对象,可以继续使用,支持链式编程!

代码:

package Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo03 {
    public static void main(String[] args) {
        //Stream 常用的Api
        /*
         forEach : 逐一处理(遍历)
         count:统计个数
            -- long count();
         filter : 过滤元素
            -- Stream<T> filter(Predicate<? super T> predicate)
         limit : 取前几个元素
         skip : 跳过前几个
         map : 加工方法
         concat : 合并流
         */

        List<String> lists = new ArrayList<>();
        Collections.addAll(lists,"张无忌","张三丰","赵敏");
        //过滤姓张的 且名字长度为三的  filter : 过滤元素
        long count = lists.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).count();
        System.out.println("姓张的,且名字长度为3的数量为:"+count);
        System.out.println("---------------------------");
        //取前两个  limit : 取前几个元素
        lists.stream().limit(2).forEach(s -> System.out.println(s));

        System.out.println("---------------------------");
        //跳过前两个  skip : 跳过前几个
        lists.stream().skip(2).forEach(s -> System.out.println(s));

        System.out.println("---------------------------");
        // 需求:在名字前面都加上 小说名   map : 加工方法
        lists.stream().map(s -> "倚天屠龙记:"+s).forEach(System.out::println);//实例方法的引用

        System.out.println("---------------------------");
        //合并流   concat : 合并流
        //数组流
        Stream<Integer> s1 = Stream.of(12,24,36,20,40,60);
        Stream<String> s2 = lists.stream();
        Stream<Object> s3 = Stream.concat(s1, s2);
        s3.forEach(System.out::println);
    }
}

在这里插入图片描述
操作起来真的是非常简单的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值