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();

 

posted @ 2018-02-13 09:13  andyalgorithm  阅读(168)  评论(0编辑  收藏  举报