• 跟上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

    @

  • 相关阅读:
    软件开发测试模式:迭代→全功能模式
    LUN挂载到Linux主机后,如何对磁盘进行分区
    MySQL性能优化方法四:SQL优化
    MySQL性能优化方法三:索引优化
    MySQL性能优化方法二:表结构优化
    MySQL性能优化方法一:缓存参数优化
    MySQL配置文件my.ini或my.cnf的位置
    javascript今生前世
    如何在sublime中使用sass
    全栈最后一公里
  • 原文地址:https://www.cnblogs.com/DarGi2019/p/12875707.html
Copyright © 2020-2023  润新知