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