• Java学习(十二)


    /**************************************************************/

    /*在线程中更新图形化界面,需要调用SwingUtilties.invokeLater。

    /*具体例子如下:

    /**************************************************************/

    在Java中支持对数值进行功能性操作的流式操作。流式操作与数据流没有任何关系,前者主要为List和Lambda表达式等,后者为input和output等。

    stream的操作有两类,第一类为中间操作,得到的结果还是流数据;第二类为末端操作,得到的数据为可输出字符。

    中间操作:

    filter:排除stream中所有与条件/断言不符合的元素

    map:对stream中的元素逐个进行映射操作

    *flatMap:将每个元素转换成无或者更多的元素

    *peek:对每个遇到的元素进行一些操作

    distinct:排除数据流中完全相同的数据

    sorted:对数据流进行一个排序操作

    limit:限定数据流中前n个数据

    substream:根据index来限定数据流中的前n个数据

    skip:忽略符合条件/断言的数据

    mapToDouble/mapToInt/mapToLong:类型转换

    末端操作:

    forEach:逐个检索stream中的数据

    toArray:将流中的数据输入到数组中

    min:求最小值

    max:求最大值

    count:计算流中的数据个数

    anyMatch:判断流中是否至少有一个元素匹配条件/断言

    allMatch:判断流中是否全部元素配对条件/断言

    noneMatch:判断流中是否没有元素配对条件/断言

    findFirst:查找流中的第一个元素

    findAny:查找流中的任意元素

    average:求平均值

     流的操作一般分为三个步骤:得到数据流、对流进行中间操作、对流进行末端操作,即得到结果。流的类型有以下几种:数组array、集合collection(包括list)、映射map。得到流的形式分别为Array.stream(array)、Collection.stream()。map没有流,但提供以下几种方法得到流:map.putlfAbsent、map.computelfPresent、map.merge。

    stream还有以下几个常有的子接口,如IntStream、DoubleSream、LongStream、stream<T>。

    stream从串行运算转换为并行运算很容易,只需要将stream()改为parallelStream(),对于多核计算机,可以大大提高运行效率。实现起来非常方便。

    数组/字符串转换成数据流有三种形式:Arrays.stream(array)、Stream.of(array)、Arrays.asList(array).stream()。具体如下

     1    public void toStream()
     2     {
     3         Stream<Integer> streamI=Stream.of(1,2,3,4,5);
     4         streamI.forEach(x->System.out.print(x+" "));
     5         System.out.println();
     6         
     7         String[] str={"Andy","Anny","Elizebath","Jane"};
     8         Stream<String> streamS=Stream.of(str);
     9         streamS.forEach(x->System.out.print(x+" "));
    10         System.out.println();
    11         
    12         Arrays.stream(str).forEach(x->System.out.print(x+" "));
    13         System.out.println();
    14         
    15         Arrays.asList(str).forEach(x->System.out.print(x+" "));
    16         System.out.println();
    17         
    18         List<String> list=Arrays.asList("Hello","world","!");
    19         list.stream().forEach(x->System.out.print(x+" "));
    20         System.out.println();            
    21     }

    下面例子以List类型为例,对流操作函数进行说明。

    利用函数collect(Collectors.asList())将流数据进行存储。

    1         List<Integer> list=Arrays.asList(6,2,3,4,4,5,1,7,8,9);
    2         List<Integer> tempInt=list.stream()//取大于5的值
    3         .sorted()//从小到大排序
    4         .distinct()//去除重复值
    5         .limit(8L)//取前三个值
    6         .filter(x->x<8)
    7         .sorted()//按照从小到大排序
    8         .map(x->x*x*x)//映射为三次方值
    9         .collect(Collectors.toList());    

     1.min()/max()操作,寻找数据流中的最小/最大数据。控制输出最大值还是最小值由用户自由控制,与函数名无关。返回的值类型为Optional。可以通过get()函数得到输出结果。

    1 Optional<Integer> min;
    2 Optional<Integer> max;
    3 min=tempInt.stream().min((n1,n2)->n1-n2);
    4 max=tempInt.stream().max((n1,n2)->n1-n2);

    得到正确结果。但将max中改为

     max=tempInt.stream().max((n1,n2)->n2-n1);

    则会得到最小结果。

    2.count()操作,计算数据流中元素的个数。

    1 long count=0;
    2 count=tempInt.stream().count();

    3.allMatch(),判断所有元素是否都满足条件。是,则返回true

    anyMatch(),判断是否存在元素满足条件。是,则返回true

    NoneMatch(),判断所有元素是否都满足条件。否,则返回true

    1         boolean bAll=false;
    2         boolean bAny=false;
    3         bAll=tempInt.stream().allMatch(x->x==8);
    4         bAny=tempInt.stream().anyMatch(x->x==8);        

    4.findAny(),查找stream中是否有元素2。若是,则返回第一个元素

    findFirst(),查找stream中第一个元素是否存在。若是,则返回第一个值

    1         Optional<Integer> findFirst;
    2         Optional<Integer> findAny;
    3         findFirst=list.stream().findFirst();
    4         findAny=list.stream().findAny();

    5.字符串大小写转换

    1         List<String> str=Arrays.asList("Hello","world","!");
    2         List<String>tempStr=str.stream()
    3         .map(String::toUpperCase)//字符串大写
    4         .map(String::toLowerCase)//字符串小写
    5         .collect(Collectors.toList());
    6 
    7         tempStr.stream().forEach(x->System.out.print(x+" "));
    8         System.out.println();
  • 相关阅读:
    在服务端合并css和js以减少http请求数
    IE6 IE7(Q) IE8(Q) 不完全支持 !important 规则
    js 获取高度,宽度,绑定事件
    一段很有用的获取页面高度的js
    filter用AJAX取回动态数据进行筛选的时候,必须同时指定标签类型和 ID,才能正常进行筛选,要不然在Firefox下会出错
    匿名函数的链式调用
    js从数组中删除指定值(不是指定位置)的元素
    纯CSS的方法解决文字溢出与截断的问题
    javascript sort 排序
    WIN10系统找不到MSVCP120.dll
  • 原文地址:https://www.cnblogs.com/2Bthebest1/p/8440444.html
Copyright © 2020-2023  润新知