JDK8新特性之Stream流

Stream流和IO(InputStream/OutputStream)没有任何关系。

Stream流式思想类似于工厂车间的“生产流水线",Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看做是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。

目录

1、Stream流初体验

2、流的获取方式

  2.1、根据Collection获取流

  2.2、Stream中的静态方法of获取流

3、Stream常用方法

3.1 、Stream流的foreach方法

3.2、Stream流的count方法

3.3、Stream流的filter方法

3.4、Stream流的limit方法

3.5、Stream流的skip方法

3.6、Stream流的map方法

3.7、Stream流的sorted方法

3.8、Stream流中的distinct方法

3.9、Stream流的match方法

3.10、Stream流的find方法

3.11、Stream流的max和min方法

3.12、Stream流的reduce方法

3.13、Stream流的Map和Reduce方法组合使用

3.14、Stream流的mapToInt方法

3.15、Stream流的concat方法

3.16、Stream流中的结果到集合中

3.17、Stream流中的结果到数组中

3.18、对流中的数据进行聚合运算

3.19、对流中的数据进行分组

3.20、对流中数据进行分区

3.21、对流中数据进行拼接


1、Stream流初体验

--描述:一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰
--需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
@Test
public void  print(){
    List<String>  list = new ArrayList<>();
    //逐个添加  :张无忌,周芷若,赵敏,张强,张三丰
   /* list.add("张无忌");
    list.add("周芷若");
    list.add("赵敏");
    list.add("张强");
    list.add("张三丰");*/
    //添加的另一种方式 一起添加
    Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
    //遍历数组 查询到长度为3且姓张的  并打印出来
    for (String name:list) {
        if(name.length()==3&&name.charAt(0) == '张'){
            System.out.println("name : "+name);
        }
    }

    //以上实现方法可以通过流式思想来实现
    list.stream()
            .filter(s -> s.startsWith("张"))   //筛选出姓张的
            .filter(s->s.length() == 3)        //筛选出长度为3的
            .forEach(System.out::println);     //将结果打印出来
}

StreamAPI可以让我们快速完成许多复杂的操作,如筛选、切片、映射、查找、去除重复、统计、匹配和规约。

2、流的获取方式

java.util.stream.Stream<T>是JDK8新加入的流接口。获取一个流非常简单,有以下几种常用的方式:

所有的Collection集合都可以通过stream默认方法获取流

Stream接口的静态方法of可以获取数组对应的流。

  2.1、根据Collection获取流

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

public interface Collection{
    default Stream<T> stream();
}

集合获取流

@Test
public void test(){
    List<String> list = new ArrayList<>();
    //...
    Stream<String> stream1 = list.stream();
    Set<String> set = new HashSet<>();
    // ...
    Stream<String> stream2 = set.stream();
    Vector<String> vector = new Vector<>();
    // ...
    Stream<String> stream3 = vector.stream();
}

java.util.Map接口不是collection的子接口,所以获取对应的流需要分key,value,entry等情况

@Test
public void test1(){
    Map<String,String> map = new HashMap<>();
    //...
    Stream<String> keyStream = map.keySet().stream();
    Stream<String> valueStream = map.values().stream();
    Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();
}

  2.2、Stream中的静态方法of获取流

由于数组对象不可能添加默认方法,所以Stream接口中提供了静态方法of

@Test
public void test2(){
    // Stream中的静态方法: static Stream of(T... values)
    Stream<String> stream6 = Stream.of("aa", "bb", "cc");
    String[] arr = {"aa", "bb", "cc"};
    Stream<String> stream7 = Stream.of(arr);
    Integer[] arr2 = {11, 22, 33};
    Stream<Integer> stream8 = Stream.of(arr2);
    // 注意:基本数据类型的数组不行
    int[] arr3 = {11, 22, 33};
    Stream<int[]> stream9 = Stream.of(arr3);
}
//of方法的参数是一个可变参数,所以支持数组

3、Stream常用方法

Stream流模型中的操作很丰富,下面是一些常用的方法

终结方法:返回值类型不在是Stream类型的方法,不在支持链式调用。其中count和foreach就是终结方法.

非终结方法:返回值类型仍然是Stream类型的方法,支持链式调用。

注意事项:

  • Stream只能操作一次
  • Stream方法返回的是新的流
  • Stream不调用终结方法,中间的操作不会执行

3.1 、Stream流的foreach方法

foreach用来遍历流中的数据

void forEach(Consumer<? super T> action);

该方法用来接受一个consumer接口函数,会将每一个流元素交给函数进行处理。

@Test
public void test2(){
    List<String> list = new ArrayList<>();
    Collections.addAll(list,"东方不败","西方失败","叶孤城","夜枭","佟福");
    //遍历数组
    System.out.println("lambda表达式形式  :  ");
    list.stream().forEach((String s)->{
        System.out.print(s+"  ");
    });
    System.out.println();
    System.out.println("lambda表达式简写形式 : ");
    list.stream().forEach(s -> System.out.print(s+"  "));
    System.out.println();
    System.out.println("方法引用 : ");
    list.stream().forEach(System.out::println);
}

3.2、Stream流的count方法

Stream流提供count方法来统计其中的元素个数

long count()

该方法返回一个long值代表元素个数。

@Test
public void test3(){
    List<String> list = new ArrayList<>();
    Collections.addAll(list,"东方不败","西方失败","叶孤城","夜枭","佟福");
    System.out.println("集合中的元素共有: "+list.stream().count()+"  个");
}

3.3、Stream流的filter方法

filter用于过滤数据,返回符合过滤条件的数据。可以通过filter方法将一个流换成另一个子集流

Stream<T> filter(Predicate<? super T> predicate);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值