美文网首页
Stream流的操作简单实践和介绍

Stream流的操作简单实践和介绍

作者: 就这些吗 | 来源:发表于2020-01-17 01:20 被阅读0次

Java 8系列之Stream的基本语法详解
巧用Java8中的Stream,让集合操作6到飞起!

一定要分清楚map这类操作和foreach一类操作的区别,

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 skip、 parallel、 sequential、 unordered都是中间操作(Intermediate),
所有中间操作是懒执行,即直到实际需要处理结果时才会执行。执行中间操作实际上并不执行任何操作,而是创建一个新的流,当遍历该流时,它包含与给定谓词匹配的原始流的元素。因此在执行管道的终止操作之前,流的遍历不会开始。

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、iterator操作都是终止操作(Terminal),会改变原来对象或者返回一个新的对象
终止操作可以遍历流生成结果或直接消费。终止操作执行后,可以认为管道流被消费了并不能再被使用。

anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit是短路操作(Short-circuiting)。
有时候需要在遍历中途停止操作,比如查找第一个满足条件的元素或者limit操作
对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream。
对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果。

public class test1 {

    
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<10;i++) {
            list.add(i);
        }
        for(int i=0;i<10;i++) {
            list.add(i);
        }
        //过滤器,也可以中间.一个distinct来过滤重复元素
    List<Integer> list1=list.stream().filter(x->x>5&&x<8).collect(Collectors.toList());

        //(oldVal, currVal) -> currVal) // key相同时当前值替换原始值
        //(oldVal, currVal) -> oldVal + currVal //key相同时保留原始值和当前值
        //将list转成map,因为list中有重复元素,需要用到函数来确认重复元素怎么操作,limit为限制大小为10
        Map<Integer, Integer> map = list1.stream()
                .limit(10)
                .collect(Collectors.toMap(
                        Integer::intValue, Integer::intValue,((oldVal, currVal) -> currVal))
                        );
        //将打印的map通过函数转成value为1.3倍的map,注意此时需要拿到entrySet后再stream(),map本身不支持stream
        Map<Integer, Integer> map2 = map.entrySet().stream()
                .collect(Collectors.toMap(
                        entry -> entry.getKey(), entry -> (int)(entry.getValue()*1.3f))
                        );
        //通过map的操作,将stream流变成value为1.3倍的流,注意map为中间操作,返回值为stream,且不会修改原来对象,此时要在后面加终止操作
        //类似于foreach,count方法,将修改返回给原来的对象
        map.entrySet().stream().map(
                (i)-> i.setValue((int)(i.getValue()*1.3f)))
        .forEach(x->System.out.println(x.toString())
                );
        //简单的打印出map里的内容
    map.entrySet().stream().forEach(x->System.out.println(x.toString()));
    
    //list1中数据有6,6,7,7,
    //max需要指定一个comparator,而他返回的是其中最后的一个值
    Optional<Integer> max = list1.stream().max((o1,o2)->o1-o2);
    //输出为7
    System.out.println(max.toString());
    //min与max类似,注意这里的排序方法已经不是自然排序了,而是倒序,min返回的是最开始的值,所以还是7
    Optional<Integer> min = list1.stream().min((o1,o2)->o2-o1);
    System.out.println(min.toString());

    }
}

相关文章

  • Stream流的操作简单实践和介绍

    Java 8系列之Stream的基本语法详解巧用Java8中的Stream,让集合操作6到飞起! 一定要分清楚ma...

  • java 函数式编程 之 Stream API (二)

    在上一篇文章中,我们介绍了java8 中 stream API 的简单使用,其中包括对于stream流操作的相关方...

  • 2020-07-04【Stream流】

    体验Stream流 Stream流的生成方式 Stream流的常见中间操作 Stream流的常见终结操作 Stre...

  • Stream操作

    1、创建Stream流 2、stream和parallelStream的简单区别 stream是顺序流,由主线程按...

  • Stream流

    体验Stream Stream流生产方式生成流list.stream()中间操作filter()终结操作forEa...

  • 浅谈node中的流stream

    简单介绍流 一般处理数据有两种模式, buffer模式和stream模式, buffer模式就是取完数据一次性操作...

  • Java8 Stream中间操作使用详解

    前面两篇简单的介绍了Stream以及如何创建Stream,没看的朋友可以戳这里: Java8的流(stream)简...

  • 恕我直言你可能真的不会java第11篇-Stream API终端

    一、Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流...

  • Java Stream find操作(六)

    Stream Head的构建(一)Stream 的中间操作(二)Stream的终止操作(三)这篇看看流的find操...

  • Stream流

    流式思想 Stream流的简单尝试 传统for循环遍历的方法 Steam流的方式 获取stream流 stream...

网友评论

      本文标题:Stream流的操作简单实践和介绍

      本文链接:https://www.haomeiwen.com/subject/vjoqzctx.html