zoukankan      html  css  js  c++  java
  • 跟上Java的脚步(一) Stream (8&9)

    编程语言就像生态系统一样,新的语言会出现,旧语言则被取代,除非它们不断演变。所以Java 也在不断地变化。

     Java 8于2014年3月发布.如:Lambda 表达式、Stream API、Date Time API、Optional 类、Nashorn, JavaScript 等等的变化

     Java 9于2017年9月发布.如:改进的 Stream API、改进 Optional 类、集合工厂方法、私有接口方法、改进的 Javadoc符合兼容 HTML5 标准 等等的变化

     Java 10于2018年3月发布.如:局部变量类型推断var关键字、垃圾回收器优化、新增的API类库(Optional.orElseThrow(),copyOf方法等等)等等的变化

     Java 11于2018年9月发布,如:Collection.toArray(IntFunction)、字符串加强(repeat(),strip(),isBlank(),lines())、HttpClient 等等的变化

     Java 12 于2019年3月19日发布.如:低暂停时间的 GC、字符串(.indent()、.transform())、Files.mismatch() 、switch-case语句的改进、支持unicode 11、 等等的变化

     Java 13于 2019年9月17日发布.如:字符串(String::stripIndent(),String::translateEscapes(),String::formatted(Object... args)) 、switch-case语句的改进、引入Text Blocks 等等

     Java 14 于2020年3月17日 发布 如:record类型、switch-case语句的改进(yield)、instanceof 改动、改进了对NullPointerExceptions的描述 等等变化

     Java 15 于2020年9月15日 发布 如:Hidden Classes、Text Blocks等等

      网址:http://openjdk.java.net/projects/jdk/15/

      

      看一个text Blocks 的例子:

      

     这些改变会让编程更容易,我们再也不用编写啰唆的语句了。

    -- Java天资不错。从一开始,它就是一门精心设计的面向对象的语言,提供了大量有用的库。由于线程和锁,他天生就支持小规模的并发。--

    Stream(jdk8)

    简介:

      Java 8的主要好处在于它提供了更多的编程工具和概念,能以更快、更简洁、更易于维护的方式解决新的或现有的编程问题。

      流处理 java.util.stream  Stream<T> 是一个比较花哨的迭代器。是一个延迟创建的集合。

        就像汽车组装流水线一样,汽车排队进入加工站,每个加工站会接收、修改汽车,然后将之传递给下一站做进一步的处理。

        尽管流水线实际上是一个序列,但不同加工站的运行一般是并行的。

        Java 8可以拿到几个CPU核,分别执行你的Stream操作流水线——这是几乎免费的并行,用不着去费劲搞Thread了

      优点:简单易懂 灵活 性能好!

      举个栗子: 取价格<400 然后 按价格排序 最后返回list; 就像一个流水线 且代码清晰可读;

     

       上代码:

    List<Menu> resultList=
                    menuList.stream()
                            .filter(d -> d.getPrice()<400)
                            .sorted(comparing(Menu::getPrice))
                            .collect(Collectors.toList());

       遍历流:看上面的代码可以看出:其实Stream已经帮我们做好了迭代的工作,只要告诉他去做什么就可以了。如果想遍历 用 forEach循环内部成员 。

     menuList.stream().forEach(System.out::println);

    使用: 

      三要素:

        1.数据源-如list 

        2.中间操作-流水线 如 filter map limit sorted distinct

        3.终端操作 如 .collect(Collectors.toList()); .count(); forEach 之类的

    filter &JDK9中新增的 takeWhile 和 dropWhile 

       看一下他们的区别: takeWhile 在没有西瓜! 而 dropWhile 是它的取反!

       .skip(1) 略过

     接收数组Arrays.stream(arr) 直接创建Stream.of(1,10,100) 创建空流Stream.empty();

     流的扁平化:flatMap

     是否存在 anyMatch 当然也有:全符合要求 allMatch ,与之相反没有一个符合:noneMatch 而且他们都是短路的~

     

     返回一个符合条件的:findAny 随便 ,findFirst 第一个

       遇到reduce 求和如此简单

     乘

    换一个:+

    再换一个+ 注意我写的是int哟

    最大值,当然也有最小值

     

     拼个字符串玩

    数值流:IntStream

     随机生成数字 如此简单 

     偶数

     举个栗子:

    水果的数量:

    Long count=menuList.stream()
                    .count();
            System.out.println(count);
    View Code

    最贵的水果:

    Comparator<Menu> menuComparator = Comparator.comparingDouble(Menu::getPrice);
            Optional<Menu> c=menuList.stream()
                    .collect(maxBy(menuComparator));
            System.out.println(c);
    View Code

      用reducing

    Comparator<Menu> menuComparator = Comparator.comparingDouble(Menu::getPrice);
            Optional<Menu> c=menuList.stream()
                    .collect(reducing((a,b)->a.getPrice()>b.getPrice()?a:b));
            System.out.println(c);
    View Code

     水果的总价:

    Double sumPrice=menuList.stream()
                    .collect(summingDouble(Menu::getPrice));
            System.out.println(sumPrice);
    View Code

     水果的平均价格:

    Double avgPrice=menuList.stream()
                    .collect(averagingDouble(Menu::getPrice));
            System.out.println(avgPrice);
    View Code

     拼接水果的名字:

    String fName=menuList.stream()
                    .map(Menu::getName)
                    .collect(joining());
            System.out.println(fName);
            String fName2=menuList.stream()
                    .map(Menu::getName)
                    .collect(joining(","));
            System.out.println(fName2);
    View Code

     分组

    按分类分组: 

    Map<String,List<Menu>> result1 = menuList.stream().collect(groupingBy(Menu::getType));
            System.out.println(result1);
    View Code

     按价格分组:

    public enum LEVEL{A,B,C}
    View Code

    Map<LEVEL,List<Menu>> result2 = menuList.stream().collect(groupingBy(d->{
                if(d.getPrice()<100) return LEVEL.A;
                else if (d.getPrice()<500) return LEVEL.B;
                else return LEVEL.C;
            }));
            System.out.println(result2);
    View Code

    筛选&分组:价格大于500 并分组:filtering

    Map<String,List<Menu>> result1 = menuList.stream().collect(groupingBy(Menu::getType,filtering(d->d.getPrice()>500,toList())));
            System.out.println(result1);
    View Code

    分组&只取名字

    Map<String,List<String>> result = menuList.stream().collect(groupingBy(Menu::getType,mapping(Menu::getName,toList())));
            System.out.println(result);
    View Code

    水果和蔬菜的数量:

    Map<String,Long> result = menuList.stream().collect(groupingBy(Menu::getType,counting()));
            System.out.println(result);
    View Code

    价格最高的:

    Map<String,Optional<Menu>> result = menuList.stream().collect(groupingBy(Menu::getType,maxBy(comparingDouble(Menu::getPrice))));
            System.out.println(result);
    View Code

    求和∑

    Map<String,Double> result = menuList.stream().collect(groupingBy(Menu::getType,summingDouble(Menu::getPrice)));
            System.out.println(result);
    View Code

    蔬菜和水果的价格分布

     分区函数=分组的特殊情况:partitioningBy 

     下一篇 继续 -》》》》https://www.cnblogs.com/DarGi2019/p/11583624.html

    @

  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/DarGi2019/p/12875707.html
Copyright © 2011-2022 走看看