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();
Java學習(十二)