JAVA之stream汪文君_Java8新特性之Stream API
Stream是Java8中處理集合的關鍵抽象概念,可以指定希望對集合進行的操作,可以執行非常復雜的查找、過濾和映射數據等操作。使用Stream API對集合數據進行操作,就類似于使用SQL執行的數據庫查詢。也可以使用Stream來并行執行操作
Stream和Collection集合的區別:
Collection是一種靜態的內存數據結構,Stream是有關計算的。
需要注意的三點
1??Stream自己不會存儲數據(所以建立在集合的基礎上)
2??Stream不會改變源對象,相反,他們會返回一個持有結果的新Stream
3??Stream操作是延遲執行的,他們會等到需要結果的時候再執行
操作Stream的三個步驟
創建Stream:通過數據源(集合、數組)獲取一個流
中間操作:中間操作鏈,對數據源的數據進行處理
終止操作:一旦執行終止操作,就執行中間操作鏈,并產生結果,之后不會再被使用(延遲執行)
創建Stream
方式一:通過集合
//通過集合創建stream List接口中的默認方法
@Test
public void test1(){
List integers = Arrays.asList(1, 2, 4, 5, 7, 8, 9, 9);
//default Stream stream():返回一個順序流
Stream stream = integers.stream();
//default Stream parallelStream():返回一個并行流
Stream parallelStream = integers.parallelStream();
}
方式二:通過Arrays
通過Arrays中的靜態方法,能夠處理對應基本類型的數組生成相應的流(IntStream,LongStream,DoubleStream),也可以生成帶泛型的流
//通過數組Arrays中的靜態方法
@Test
public void test2(){
int[] arrs = new int[]{1,2,4,5,6,6,7,7};
IntStream stream = Arrays.stream(arrs);
String[] names = new String[]{"ssy","cf"};
Stream stringStream = Arrays.stream(names);
}
方式三:通過Stream的of()
@Test
public void test3(){
Stream stream = Stream.of(1,2,4,5,5,8);
}
方式四:通過Stream創建無限流
@Test
public void test4(){
//public static Stream iterate(T seed, java.util.function.UnaryOperator f)
Stream.iterate(0,t->t+2).limit(20).forEach(System.out::println);
//public static Stream generate(java.util.function.Supplier s)
Stream.generate(Math::random).limit(20).forEach(System.out::println);
}
Stream的中間操作
多個中間操作可以鏈接起來形成一個流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何的處理!而在終止操作時一次性全部處理,稱為“惰性求值”
1、篩選與切片
filter(Predicate p)接受Lambda,從流中排除某些元素
distinct()篩選,通過流生成元素的hashcode和equals去除重復元素
limit(long maxSize)截斷流,使元素不超過給定的數量
skip(long n)跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流
@Test
public void test5(){
List names = Arrays.asList("Tom", "Ssy", "Cf", "Sherry", "Juddy");
Stream stream = names.stream();
stream.filter(name -> name.length()<=3).forEach(System.out::println);
System.out.println("*************");
//終止操作后不能再操作該stream,需要重新生成
names.stream().limit(3).forEach(System.out::println);
System.out.println("**************");
names.stream().skip(2).forEach(System.out::println);
System.out.println("****************");
List names1 = new ArrayList<>(names);//因為asList的結果不能add了
names1.add("Yu");
names1.add("Yu");
names1.add("Yu");
names1.add("Yu");
System.out.println(names1.toString());
names1.stream().distinct().forEach(System.out::println);
}
2、映射
map(Function f) 接受一個函數作為參數,該函數會被應用到每個元素上,并將其映射為一個新的元素
flatMap(Function f) 接收一個函數作為參數,將流中的每個值都轉換成另一個流,然后將所有流連接成一個流
兩者之間的關系類似于下述關系
@Test
public void test6(){
List list=new ArrayList(Arrays.asList(1,2,3,4));
List list1 = Arrays.asList(5,6,7,8);
list.add(list1);
System.out.println(list);
List list2=new ArrayList(Arrays.asList(1,2,3,4));
list2.addAll(list1);
System.out.println(list2);
}
例子
@Test
public void test7(){
//map
List strings = Arrays.asList("aa", "bb", "cc");
strings.stream().map(String::toUpperCase).forEach(System.out::println);
//flatMap
strings.stream().map(StreamTest::fromStringToStream).forEach(System.out::println);
strings.stream().flatMap(StreamTest::fromStringToStream).forEach(System.out::println);
}
public static Stream fromStringToStream(String str){
char[] strs = str.toCharArray();
ArrayList arrs = new ArrayList<>();
for(char c:strs){
arrs.add(c);
}
return arrs.stream();
}
3、排序
自然排序與定制排序
@Test
public void test8(){
//sorted()
List integers = Arrays.asList(34, 64, 23, 6, 53, 77);
integers.stream().sorted().forEach(System.out::println);
//sorted(Comparator com)
List employees = new ArrayList<>();
employees.stream().sorted((e1,e2) -> Integer.compare(e1.getAge(), e2.getAge())).forEach(System.out::println);
}
Stream的終止操作
終止操作會從流的流水線生成結果,其結果可以是任何不是流的指,例如List、Integer,甚至是void。流進行終止操作后,不能再次使用
1、匹配與查找
allMatch(Predicate p) 檢查是否匹配所有元素
anyMatch(Predicate p) 檢查是否至少匹配一個元素
noneMatch(Predicate p) 檢查是否沒有元素匹配
findFirst()返回第一個元素
findAny() 返回當前流中的任意元素
count() 返回流中元素的總個數
max(Comparator) 返回流中的最大值
min(Comparator)返回流中的最小值
forEach(Consumer c)內部迭代
2、規約
reduce(T identity, BinaryOperator b)可以將流中的元素反復結合起來,得到一個值,返回T
@Test
public void test9(){
//計算1-10自然數的和
Integer reduce = Stream.iterate(1, e -> e + 1).limit(10).reduce(0, Integer::sum);
System.out.println(reduce);
}
reduce(BinaryOperator b)可以將流中的元素反復結合起來,得到一個值,返回 Optional (在optional相關類中再講)
3、收集
collect(Collector c) 將流轉換為其他形式,接受一個collector接口的實現,用于給Stream中元素做匯總的方法
Collectors實用類,方便地創建常見收集器實例
@Test
public void test10(){
List integers = Arrays.asList(34, 64, 23, 6, 53, 77);
List collect = integers.stream().collect(Collectors.toList());
collect.forEach(System.out::println);
}
總結
以上是生活随笔為你收集整理的JAVA之stream汪文君_Java8新特性之Stream API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝CSV每个字段的数据容量原来有限制的
- 下一篇: zbb20180710 maven Fa